X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FEmulate%2FClass%2FAccessor%2FFast.pm;h=346aea8d353ed71218d5524002c9c63dd489f6e0;hb=04283e901fb71c2bb86cfa69d0731d07d34c7147;hp=c0c1b6a9e9b23a8f4172a96a1ca1099bfcab22da;hpb=30858ec77edcaee7ec99ecdbc6b9a93b54cfc75c;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 c0c1b6a..346aea8 100644 --- a/lib/MooseX/Emulate/Class/Accessor/Fast.pm +++ b/lib/MooseX/Emulate/Class/Accessor/Fast.pm @@ -4,12 +4,13 @@ use Moose::Role; use Class::MOP (); use Scalar::Util (); -our $VERSION = '0.00700'; +use MooseX::Emulate::Class::Accessor::Fast::Meta::Accessor (); + +our $VERSION = '0.00902'; =head1 NAME -MooseX::Emulate::Class::Accessor::Fast - - Emulate Class::Accessor::Fast behavior using Moose attributes +MooseX::Emulate::Class::Accessor::Fast - Emulate Class::Accessor::Fast behavior using Moose attributes =head1 SYNOPSYS @@ -22,9 +23,9 @@ MooseX::Emulate::Class::Accessor::Fast - #fields with readers and writers __PACKAGE__->mk_accessors(qw/field1 field2/); #fields with readers only - __PACKAGE__->mk_accessors(qw/field3 field4/); + __PACKAGE__->mk_ro_accessors(qw/field3 field4/); #fields with writers only - __PACKAGE__->mk_accessors(qw/field5 field6/); + __PACKAGE__->mk_wo_accessors(qw/field5 field6/); =head1 DESCRIPTION @@ -75,18 +76,17 @@ my $locate_metaclass = sub { || Moose::Meta::Class->initialize($class); }; -sub BUILD { +sub BUILD { } + +around 'BUILD' => sub { + my $orig = shift; my $self = shift; - my %args; - if (scalar @_ == 1 && defined $_[0] && ref($_[0]) eq 'HASH') { - %args = %{$_[0]}; - } elsif( scalar(@_) ) { - %args = @_; - } + my %args = %{ $_[0] }; + $self->$orig(\%args); my @extra = grep { !exists($self->{$_}) } keys %args; @{$self}{@extra} = @args{@extra}; return $self; -} +}; =head2 mk_accessors @field_names @@ -99,9 +99,14 @@ will be passed. Please see L for more information. =cut -sub mk_accessors{ +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); @@ -110,18 +115,21 @@ sub mk_accessors{ #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 %opts = ( $meta->has_method($reader) ? ( is => 'bare' ) : (accessor => $reader) ); + 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); - my @alias_method = $attr->process_accessors(accessor => $alias, 0); - $meta->add_method(@alias_method); + $meta->add_method($alias => $attr->get_read_method_ref); } } 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'] + ); } } } @@ -132,15 +140,21 @@ Create read-only accessors. =cut -sub mk_ro_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 @opts = ($meta->has_method($reader) ? (is => 'bare') : (reader => $reader) ); + 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"); @@ -155,15 +169,21 @@ Create write-only accessors. =cut #this is retarded.. but we need it for compatibility or whatever. -sub mk_wo_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"); @@ -178,7 +198,7 @@ See original L documentation for more information. =cut -sub follow_best_practice{ +sub follow_best_practice { my $self = shift; my $meta = $locate_metaclass->($self); @@ -196,8 +216,8 @@ See original L documentation for more information. =cut -sub mutator_name_for{ return $_[1] } -sub accessor_name_for{ return $_[1] } +sub mutator_name_for { return $_[1] } +sub accessor_name_for { return $_[1] } =head2 set @@ -205,7 +225,7 @@ See original L documentation for more information. =cut -sub set{ +sub set { my $self = shift; my $k = shift; confess "Wrong number of arguments received" unless scalar @_; @@ -223,7 +243,7 @@ See original L documentation for more information. =cut -sub get{ +sub get { my $self = shift; confess "Wrong number of arguments received" unless scalar @_; my $meta = $locate_metaclass->($self); @@ -242,7 +262,10 @@ 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'], + is => 'bare', + ); my $reader = $attr->get_read_method_ref; my $writer = $attr->get_write_method_ref; return sub { @@ -256,7 +279,10 @@ 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'], + is => 'bare', + ); return $attr->get_read_method_ref; } @@ -264,7 +290,10 @@ 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'], + is => 'bare', + ); return $attr->get_write_method_ref; } @@ -289,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