#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/cmpthese/;
{
package Foo;
sub new{ bless {}, shift }
}
eval q{
package C::XSAOne;
use Class::XSAccessor
constructor => 'new',
accessors => { n => 'n' },
;
1;
};
for my $klass (qw/Moose Mouse/) {
eval qq{
package ${klass}One;
use $klass;
has n => (
is => 'rw',
isa => 'Foo',
);
no $klass;
__PACKAGE__->meta->make_immutable;
};
die $@ if $@;
}
print "Class::MOP: $Class::MOP::VERSION\n";
print "Moose: $Moose::VERSION\n";
print "Mouse: $Mouse::VERSION\n";
print "---- new\n";
my $foo = Foo->new();
my @classes = qw(Moose Mouse);
if(C::XSAOne->can('new')){
push @classes, 'C::XSA';
}
cmpthese(
-1 => {
map { my $x = $_; $_ => sub { $x->new(n => $foo) } }
map { "${_}One" } @classes
}
);
print "---- new,set\n";
cmpthese(
-1 => {
map { my $y = $_; $_ => sub { $y->new(n => $foo)->n($foo) } }
map { "${_}One" } @classes
}
);
print "---- set\n";
my %c = map { $_ => "${_}One"->new(n => $foo) } @classes;
cmpthese(
-1 => {
map { my $y = $_; $_ => sub { $c{$y}->n($foo) } } @classes
}
);