The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;
use Benchmark qw(:all);

use Class::Monadic qw(monadic);
use Object::Accessor;

{
	package CM;
	sub new{ bless {}, shift }
}
{
	package M;
	use Mouse;

	has foo =>
		is => 'rw',
	;
	__PACKAGE__->meta->make_immutable();
}

print "Create and add fields\n";

cmpthese -1 => {
	'Class::Monadic' => sub{
		my $o = CM->new();
		monadic($o)->add_field('foo');
	},
	'Mouse' => sub{
		my $o = M->new();
	},
};

print "\nField accesses\n";
my $cm = CM->new;
monadic($cm)->add_field('foo');

my $m = M->new;

cmpthese timethese -1 => {
	'Class::Monadic' => sub{
		for(1 .. 5){
			$cm->set_foo($_);

			my $sum = 0;
			for(1 .. 5){
				$sum += $cm->get_foo();
			}
			$sum == ($_ * 5) or die $sum;
		}
	},
	'Mouse' => sub{
		for(1 .. 5){
			$m->foo($_);

			my $sum = 0;
			for(1 .. 5){
				$sum += $m->foo();
			}
			$sum == ($_ * 5) or die $sum;
		}
	},
};