X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FEmulate%2FClass%2FAccessor%2FFast.pm;h=33e94262541721d0d3fde4d52b7bbce44f4a8d37;hb=986ca883db6e4deaa12b4a0d1245e6d85be54bef;hp=0f1fbdd9db4718bb3b0f9ab9f7f234dc5e2a1402;hpb=5a6e3389d072389c7d9a798a1b35c4cfa86012f3;p=gitmo%2FMooseX-Emulate-Class-Accessor-Fast.git diff --git a/lib/MooseX/Emulate/Class/Accessor/Fast.pm b/lib/MooseX/Emulate/Class/Accessor/Fast.pm index 0f1fbdd..33e9426 100644 --- a/lib/MooseX/Emulate/Class/Accessor/Fast.pm +++ b/lib/MooseX/Emulate/Class/Accessor/Fast.pm @@ -4,7 +4,9 @@ use Moose::Role; use Class::MOP (); use Scalar::Util (); -our $VERSION = '0.00600'; +use MooseX::Emulate::Class::Accessor::Fast::Meta::Accessor (); + +our $VERSION = '0.00800'; =head1 NAME @@ -102,14 +104,23 @@ will be passed. Please see L for more information. sub mk_accessors{ my $self = shift; my $meta = $locate_metaclass->($self); + my $class = $meta->name; + confess("You are trying to modify ${class}, which has been made immutable, this is ". + "not supported. Try subclassing ${class}, rather than monkeypatching it") + if $meta->is_immutable; + for my $attr_name (@_){ + $meta->remove_attribute($attr_name) + if $meta->find_attribute_by_name($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 = ( $meta->has_method($reader) ? () : (accessor => $reader) ); - my $attr = $meta->add_attribute($attr_name, %opts); + my $attr = $meta->find_attribute_by_name($attr_name) || $meta->add_attribute($attr_name, %opts, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ); if($attr_name eq $reader){ my $alias = "_${attr_name}_accessor"; next if $meta->has_method($alias); @@ -119,7 +130,9 @@ sub mk_accessors{ } else { my @opts = ( $meta->has_method($writer) ? () : (writer => $writer) ); push(@opts, (reader => $reader)) unless $meta->has_method($reader); - $meta->add_attribute($attr_name, @opts); + my $attr = $meta->find_attribute_by_name($attr_name) || $meta->add_attribute($attr_name, @opts, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ); } } } @@ -133,10 +146,18 @@ Create read-only accessors. sub mk_ro_accessors{ my $self = shift; my $meta = $locate_metaclass->($self); + my $class = $meta->name; + confess("You are trying to modify ${class}, which has been made immutable, this is ". + "not supported. Try subclassing ${class}, rather than monkeypatching it") + if $meta->is_immutable; for my $attr_name (@_){ + $meta->remove_attribute($attr_name) + if $meta->find_attribute_by_name($attr_name); my $reader = $self->accessor_name_for($attr_name); my @opts = ($meta->has_method($reader) ? () : (reader => $reader) ); - my $attr = $meta->add_attribute($attr_name, @opts); + my $attr = $meta->add_attribute($attr_name, @opts, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ) if scalar(@opts); if($reader eq $attr_name && $reader eq $self->mutator_name_for($attr_name)){ $meta->add_method("_${attr_name}_accessor" => $attr->get_read_method_ref) unless $meta->has_method("_${attr_name}_accessor"); @@ -154,10 +175,18 @@ Create write-only accessors. sub mk_wo_accessors{ my $self = shift; my $meta = $locate_metaclass->($self); + my $class = $meta->name; + confess("You are trying to modify ${class}, which has been made immutable, this is ". + "not supported. Try subclassing ${class}, rather than monkeypatching it") + if $meta->is_immutable; for my $attr_name (@_){ + $meta->remove_attribute($attr_name) + if $meta->find_attribute_by_name($attr_name); my $writer = $self->mutator_name_for($attr_name); my @opts = ($meta->has_method($writer) ? () : (writer => $writer) ); - my $attr = $meta->add_attribute($attr_name, @opts); + my $attr = $meta->add_attribute($attr_name, @opts, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ) if scalar(@opts); if($writer eq $attr_name && $writer eq $self->accessor_name_for($attr_name)){ $meta->add_method("_${attr_name}_accessor" => $attr->get_write_method_ref) unless $meta->has_method("_${attr_name}_accessor"); @@ -236,7 +265,9 @@ sub get{ sub make_accessor { my($class, $field) = @_; my $meta = $locate_metaclass->($class); - my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ); my $reader = $attr->get_read_method_ref; my $writer = $attr->get_write_method_ref; return sub { @@ -250,7 +281,9 @@ sub make_accessor { sub make_ro_accessor { my($class, $field) = @_; my $meta = $locate_metaclass->($class); - my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ); return $attr->get_read_method_ref; } @@ -258,7 +291,9 @@ sub make_ro_accessor { sub make_wo_accessor { my($class, $field) = @_; my $meta = $locate_metaclass->($class); - my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field, + traits => ['MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'] + ); return $attr->get_write_method_ref; } @@ -283,7 +318,9 @@ With contributions from: =over 4 -=item Tomas Doran Ebobtfish@bobtfish.netE +=item Tomas Doran (t0m) Ebobtfish@bobtfish.netE + +=item Florian Ragwitz (rafl) Erafl@debian.orgE =back