X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FAttribute.pm;h=ec752cb08aa0fc5b6ad5d2df7b4edebdadb281b8;hb=284ca75b14da9b2685a78b7a0d4228512c8575c6;hp=8511bc2054933aeebf6ddd371e1f4340830176bf;hpb=1b9e472d8c7e704eced9b2ea83194f83f0265018;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Attribute.pm b/lib/Mouse/Meta/Attribute.pm index 8511bc2..ec752cb 100644 --- a/lib/Mouse/Meta/Attribute.pm +++ b/lib/Mouse/Meta/Attribute.pm @@ -5,31 +5,13 @@ use warnings; use Carp (); use Scalar::Util qw(weaken); -use Mouse::Util; +use Mouse::Util qw(:meta); use Mouse::Meta::TypeConstraint; use Mouse::Meta::Method::Accessor; -sub BUILDARGS{ - my $class = shift; - my $name = shift; - my %args = (@_ == 1) ? %{$_[0]} : @_; - - $args{name} = $name; - - # XXX: for backward compatibility (with method modifiers) - if($class->can('canonicalize_args') != \&canonicalize_args){ - %args = $class->canonicalize_args($name, %args); - } - - return \%args; -} - -sub new { - my $class = shift; - my $args = $class->BUILDARGS(@_); - - my $name = $args->{name}; +sub _process_options{ + my($class, $name, $args) = @_; # taken from Class::MOP::Attribute::new @@ -137,11 +119,28 @@ sub new { || $class->throw_error("You cannot have lazy attribute ($name) without specifying a default value for it"); } - my $instance = bless $args, $class; + # XXX: for backward compatibility (with method modifiers) + if($class->can('canonicalize_args') != \&canonicalize_args){ + %{$args} = $class->canonicalize_args($name, %{$args}); + } + return; +} + +sub new { + my $class = shift; + my $name = shift; + + my %args = (@_ == 1) ? %{ $_[0] } : @_; + + $class->_process_options($name, \%args); + + $args{name} = $name; + + my $instance = bless \%args, $class; # extra attributes if($class ne __PACKAGE__){ - $class->meta->_initialize_instance($instance, $args); + $class->meta->_initialize_instance($instance,\%args); } # XXX: there is no fast way to check attribute validity @@ -154,16 +153,6 @@ sub new { return $instance } -sub does { - my ($self, $role_name) = @_; - my $meta = Mouse::Meta::Class->initialize(ref($self) || $self); - - (defined $role_name) - || $meta->throw_error("You must supply a role name to does()"); - - return $meta->does_role($role_name); -}; - # readers sub name { $_[0]->{name} } @@ -217,16 +206,16 @@ sub _create_args { sub accessor_metaclass { 'Mouse::Meta::Method::Accessor' } -sub interpolate_class_and_new{ +sub interpolate_class{ my($class, $name, $args) = @_; if(my $metaclass = delete $args->{metaclass}){ $class = Mouse::Util::resolve_metaclass_alias( Attribute => $metaclass ); } - + my @traits; if(my $traits_ref = delete $args->{traits}){ - my @traits; + for (my $i = 0; $i < @{$traits_ref}; $i++) { my $trait = Mouse::Util::resolve_metaclass_alias(Attribute => $traits_ref->[$i], trait => 1); @@ -245,19 +234,17 @@ sub interpolate_class_and_new{ roles => \@traits, cache => 1, )->name; - - $args->{traits} = \@traits; } } - return $class->new($name, $args); + return( $class, @traits ); } sub canonicalize_args{ my ($self, $name, %args) = @_; Carp::cluck("$self->canonicalize_args has been deprecated." - . "Use \$self->BUILDARGS instead."); + . "Use \$self->_process_options instead."); return %args; }