package DateTime::Diet;

use strict;
use warnings;

use DateTime;
use vars qw/$AUTOLOAD/;

sub new {
	my $class = shift;
	my %args = @_;

	return bless \%args, $class;
}

sub AUTOLOAD {

	my $attr = $AUTOLOAD;
	$attr =~ s/.*:://;
    return unless $attr =~ /[^A-Z]/;  # skip DESTROY and all-cap methods

	if ($attr && $attr=~/^set_(year|month|hour|minute|second|nanosecond|locale|time_zone)$/) {
		$_[0]->{$1} = $_[1];
		return $_[0];
	}
	if ($attr && $attr=~/^(month|day|hour|min(ute)?|sec(ond)?)$/) {
		return $_[0]->{$1} if $_[0]->{$1};
		return 1 if $1=~/month|day/;
		return 0;
	}

	$_[0] = bless \%{new DateTime(%{$_[0]})}, 'DateTime';
	return $_[0]->$attr(@_);
}


package main;

use DateTime;
use Benchmark;

print "These tests compare DateTime::Diet to DateTime for object creation, plus simple accessors and mutators\n\n";
timethese(50000, {
	'      DateTime' => sub { my $dt = new DateTime( year => 2004 ); my $day = $dt->day; $dt->set_minute(22); },
	'DateTime::Diet' => sub { my $dt = new DateTime::Diet( year => 2004 ); my $day = $dt->day; $dt->set_minute(22); },
});

print "\n\nThese tests compare DateTime::Diet to DateTime for the same things, but then call a non-diet function causing the object to become a full blown DateTime object.\n\n";
timethese(10000, {
	'      DateTime' => sub { my $dt = new DateTime( year => 2004 ); my $day = $dt->day; $dt->set_minute(22); $dt->datetime; $day=$dt->day; },
	'DateTime::Diet' => sub { my $dt = new DateTime::Diet( year => 2004 ); my $day = $dt->day; $dt->set_minute(22); $dt->datetime; $day=$dt->day; },
});






