Index: t/meta.t =================================================================== --- t/meta.t (revision 0) +++ t/meta.t (revision 0) @@ -0,0 +1,30 @@ +use strict; +use warnings; +use Carp (); +use Test::More tests => 4; +use MooseX::Adopt::Class::Accessor::Fast; +{ + package TestPackage; + use Moose; + with 'MooseX::Emulate::Class::Accessor::Fast'; + __PACKAGE__->mk_accessors(qw/ normal /); + __PACKAGE__->meta->make_immutable; +} +{ + package TestPackage::SubClass; + use base qw/TestPackage/; + __PACKAGE__->mk_accessors(qw/ meta /); +} + +my $i = TestPackage::SubClass->new({ normal => 42, meta => 66 }); + +# 1,2 +is $i->normal, 42, 'normal accessor read value from constructor'; +$i->normal(2); +is $i->normal, 2, 'normal accessor read set value'; + +# 3,4 +is $i->meta, 66, 'meta accessor read value from constructor'; +$i->meta(9); +is $i->meta, 9, 'meta accessor read set value'; + Index: lib/MooseX/Emulate/Class/Accessor/Fast.pm =================================================================== --- lib/MooseX/Emulate/Class/Accessor/Fast.pm (revision 7020) +++ lib/MooseX/Emulate/Class/Accessor/Fast.pm (working copy) @@ -93,14 +93,15 @@ sub mk_accessors{ my $self = shift; - my $meta = $self->meta; + my $meta = $self->Moose::Object::meta; + $meta->make_mutable if $meta->is_immutable; for my $attr_name (@_){ my $reader = $self->accessor_name_for($attr_name); my $writer = $self->mutator_name_for( $attr_name); #dont overwrite existing methods if($reader eq $writer){ - my %opts = ( $self->can($reader) ? () : (accessor => $reader) ); + my %opts = ( $self->can($reader) && $reader ne 'meta' ? () : (accessor => $reader) ); my $attr = $meta->add_attribute($attr_name, %opts); if($attr_name eq $reader){ my $alias = "_${attr_name}_accessor"; @@ -115,6 +116,7 @@ $meta->add_attribute($attr_name, @opts); } } + $meta->make_immutable; } =head2 mk_ro_accessors @field_names