8 has foo => (is => 'rw');
11 package MooseImmutable;
13 has foo => (is => 'rw');
14 __PACKAGE__->meta->make_immutable();
17 package MooseImmutable::NoConstructor;
19 has foo => (is => 'rw');
20 __PACKAGE__->meta->make_immutable(inline_constructor => 0);
21 __PACKAGE__->meta->get_attribute("foo")->Moose::XS::new_accessor(__PACKAGE__ . "::foo");
25 package ClassAccessorFast;
28 use base 'Class::Accessor::Fast';
29 __PACKAGE__->mk_accessors(qw(foo));
32 use Benchmark qw(cmpthese);
33 use Benchmark ':hireswallclock';
35 my $moose = PlainMoose->new;
36 my $moose_immut = MooseImmutable->new;
37 my $moose_immut_no_const = MooseImmutable::NoConstructor->new;
38 my $caf = ClassAccessorFast->new;
44 cmpthese($acc_rounds, {
45 Moose => sub { $moose->foo(23) },
46 MooseImmutable => sub { $moose_immut->foo(23) },
47 MooseImmutableNoConstructor => sub { $moose_immut_no_const->foo(23) },
48 ClassAccessorFast => sub { $caf->foo(23) },
52 cmpthese($acc_rounds, {
53 Moose => sub { $moose->foo },
54 MooseImmutable => sub { $moose_immut->foo },
55 MooseImmutableNoConstructor => sub { $moose_immut_no_const->foo },
56 ClassAccessorFast => sub { $caf->foo },
59 my (@moose, @moose_immut, @moose_immut_no_const, @caf_stall);
61 cmpthese($ins_rounds, {
62 Moose => sub { push @moose, PlainMoose->new(foo => 23) },
63 MooseImmutable => sub { push @moose_immut, MooseImmutable->new(foo => 23) },
64 MooseImmutableNoConstructor => sub { push @moose_immut_no_const, MooseImmutable::NoConstructor->new(foo => 23) },
65 ClassAccessorFast => sub { push @caf_stall, ClassAccessorFast->new({foo => 23}) },
68 my ( $moose_idx, $moose_immut_idx, $moose_immut_no_const_idx, $caf_idx ) = ( 0, 0, 0, 0 );
69 print "\nDESTRUCTION\n";
70 cmpthese($ins_rounds, {
72 $moose[$moose_idx] = undef;
75 MooseImmutable => sub {
76 $moose_immut[$moose_immut_idx] = undef;
79 MooseImmutableNoConstructor => sub {
80 $moose_immut_no_const[$moose_immut_no_const_idx] = undef;
81 $moose_immut_no_const_idx++;
83 ClassAccessorFast => sub {
84 $caf_stall[$caf_idx] = undef;