X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FEmulate%2FClass%2FAccessor%2FFast.pm;h=f87ca44bd26aa6df565bd75d19a3a93cc9e9dddf;hb=8eb9108bc536b72c729ed2f454085f429472a2ff;hp=503f54f368e5974cc0993060461b2bcacdb86fa6;hpb=d82bc8be260465d7e6e4c050dd427ca58cd4f32a;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 503f54f..f87ca44 100644 --- a/lib/MooseX/Emulate/Class/Accessor/Fast.pm +++ b/lib/MooseX/Emulate/Class/Accessor/Fast.pm @@ -2,7 +2,7 @@ package MooseX::Emulate::Class::Accessor::Fast; use Moose::Role; -our $VERSION = '0.00300'; +our $VERSION = '0.00400'; =head1 NAME @@ -97,17 +97,23 @@ sub mk_accessors{ for my $attr_name (@_){ my $reader = $self->accessor_name_for($attr_name); my $writer = $self->mutator_name_for( $attr_name); + #dont overwrite existing methods - my @opts = $reader eq $writer ? - ( $self->can($reader) ? () : (accessor => $reader) ) : - ( - ( $self->can($reader) ? () : (reader => $reader) ), - ( $self->can($writer) ? () : (writer => $writer) ), - ); - $meta->add_attribute($attr_name, @opts); - - $meta->add_method("_${attr_name}_accessor", $self->can($reader) ) - if($reader eq $attr_name && !$self->can("_${attr_name}_accessor") ); + if($reader eq $writer){ + my %opts = ( $self->can($reader) ? () : (accessor => $reader) ); + my $attr = $meta->add_attribute($attr_name, %opts); + if($attr_name eq $reader){ + my $alias = "_${attr_name}_accessor"; + next if $self->can($alias); + my @alias_method = $opts{accessor} ? ( $alias => $self->can($reader) ) + : ( $attr->process_accessors(accessor => $alias, 0 ) ); + $meta->add_method(@alias_method); + } + } else { + my @opts = ( $self->can($writer) ? () : (writer => $writer) ); + push(@opts, (reader => $reader)) unless $self->can($reader); + $meta->add_attribute($attr_name, @opts); + } } } @@ -122,10 +128,12 @@ sub mk_ro_accessors{ my $meta = $self->meta; for my $attr_name (@_){ my $reader = $self->accessor_name_for($attr_name); - $meta->add_attribute($attr_name, - $self->can($reader) ? () : (reader => $reader) ); - $meta->add_method("_${attr_name}_accessor", $meta->find_method_by_name($reader)) - if($reader eq $attr_name && !$self->can("_${attr_name}_accessor") ); + my @opts = ($self->can($reader) ? () : (reader => $reader) ); + my $attr = $meta->add_attribute($attr_name, @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 $self->can("_${attr_name}_accessor"); + } } } @@ -141,9 +149,12 @@ sub mk_wo_accessors{ my $meta = $self->meta; for my $attr_name (@_){ my $writer = $self->mutator_name_for($attr_name); - $meta->add_attribute($attr_name, $self->can($writer) ? () : (writer => $writer) ); - $meta->add_method("_${attr_name}_accessor", $meta->find_method_by_name($writer)) - if($writer eq $attr_name && !$self->can("_${attr_name}_accessor") ); + my @opts = ($self->can($writer) ? () : (writer => $writer) ); + my $attr = $meta->add_attribute($attr_name, @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 $self->can("_${attr_name}_accessor"); + } } } @@ -215,6 +226,36 @@ sub get{ return @values; } +sub make_accessor { + my($class, $field) = @_; + my $meta = $class->meta; + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + my $reader = $attr->get_read_method_ref; + my $writer = $attr->get_write_method_ref; + return sub { + my $self = shift; + return $self->$reader unless @_; + return $self->$writer((@_ > 1 ? [@_] : @_)); + } +} + + +sub make_ro_accessor { + my($class, $field) = @_; + my $meta = $class->meta; + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + return $attr->get_read_method_ref; +} + + +sub make_wo_accessor { + my($class, $field) = @_; + my $meta = $class->meta; + my $attr = $meta->find_attribute_by_name($field) || $meta->add_attribute($field); + return $attr->get_write_method_ref; +} + + 1; =head2 meta