X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FClass.pm;h=4f811d96b93b29bbea1e6bb5c80036cc0c6e5c78;hb=8d40c3b80e6e4cebdf951d289d6b5d33b7641338;hp=6abc7b2740fb2d33e821624a3400ef31d297c1f0;hpb=8215d7254eb706c929b0cfa9efafb7a5e6db658b;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 6abc7b2..4f811d9 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -25,10 +25,11 @@ sub _construct_meta { \@{ $args{package} . '::ISA' }; }; - #return Mouse::Meta::Class->initialize($class)->new_object(%args) - # if $class ne __PACKAGE__; - - return bless \%args, ref($class) || $class; + my $self = bless \%args, ref($class) || $class; + if($class ne __PACKAGE__){ + $self->_initialize_object($self, \%args); + } + return $self; } sub create_anon_class{ @@ -103,7 +104,7 @@ sub add_attribute { my $inherited_attr; foreach my $class($self->linearized_isa){ - my $meta = Mouse::Meta::Module::get_metaclass_by_name($class) or next; + my $meta = Mouse::Util::get_metaclass_by_name($class) or next; $inherited_attr = $meta->get_attribute($name) and last; } @@ -131,16 +132,20 @@ sub add_attribute { return $attr; } -sub compute_all_applicable_attributes { shift->get_all_attributes(@_) } +sub compute_all_applicable_attributes { + Carp::cluck('compute_all_applicable_attributes() has been deprecated'); + return shift->get_all_attributes(@_) +} + sub get_all_attributes { my $self = shift; my (@attr, %seen); for my $class ($self->linearized_isa) { - my $meta = $self->_metaclass_cache($class) + my $meta = Mouse::Util::get_metaclass_by_name($class) or next; - for my $name (keys %{ $meta->get_attribute_map }) { + for my $name ($meta->get_attribute_list) { next if $seen{$name}++; push @attr, $meta->get_attribute($name); } @@ -155,14 +160,14 @@ sub new_object { my $self = shift; my %args = (@_ == 1 ? %{$_[0]} : @_); - my $instance = bless {}, $self->name; + my $object = bless {}, $self->name; - $self->_initialize_instance($instance, \%args); - return $instance; + $self->_initialize_object($object, \%args); + return $object; } -sub _initialize_instance{ - my($self, $instance, $args) = @_; +sub _initialize_object{ + my($self, $object, $args) = @_; my @triggers_queue; @@ -171,13 +176,13 @@ sub _initialize_instance{ my $key = $attribute->name; if (defined($from) && exists($args->{$from})) { - $instance->{$key} = $attribute->_coerce_and_verify($args->{$from}); + $object->{$key} = $attribute->_coerce_and_verify($args->{$from}); - weaken($instance->{$key}) - if ref($instance->{$key}) && $attribute->is_weak_ref; + weaken($object->{$key}) + if ref($object->{$key}) && $attribute->is_weak_ref; if ($attribute->has_trigger) { - push @triggers_queue, [ $attribute->trigger, $instance->{$from} ]; + push @triggers_queue, [ $attribute->trigger, $object->{$key} ]; } } else { @@ -185,15 +190,15 @@ sub _initialize_instance{ unless ($attribute->is_lazy) { my $default = $attribute->default; my $builder = $attribute->builder; - my $value = $builder ? $instance->$builder() - : ref($default) eq 'CODE' ? $instance->$default() + my $value = $builder ? $object->$builder() + : ref($default) eq 'CODE' ? $object->$default() : $default; # XXX: we cannot use $attribute->set_value() because it invokes triggers. - $instance->{$key} = $attribute->_coerce_and_verify($value, $instance);; + $object->{$key} = $attribute->_coerce_and_verify($value, $object);; - weaken($instance->{$key}) - if ref($instance->{$key}) && $attribute->is_weak_ref; + weaken($object->{$key}) + if ref($object->{$key}) && $attribute->is_weak_ref; } } else { @@ -206,35 +211,28 @@ sub _initialize_instance{ foreach my $trigger_and_value(@triggers_queue){ my($trigger, $value) = @{$trigger_and_value}; - $trigger->($instance, $value); + $trigger->($object, $value); } if($self->is_anon_class){ - $instance->{__METACLASS__} = $self; + $object->{__METACLASS__} = $self; } - return $instance; + return $object; } sub clone_object { - my $class = shift; - my $instance = shift; - my %params = (@_ == 1) ? %{$_[0]} : @_; + my $class = shift; + my $object = shift; + my %params = (@_ == 1) ? %{$_[0]} : @_; - (blessed($instance) && $instance->isa($class->name)) - || $class->throw_error("You must pass an instance of the metaclass (" . $class->name . "), not ($instance)"); + (blessed($object) && $object->isa($class->name)) + || $class->throw_error("You must pass an instance of the metaclass (" . $class->name . "), not ($object)"); - my $clone = bless { %$instance }, ref $instance; - - foreach my $attr ($class->get_all_attributes()) { - if ( defined( my $init_arg = $attr->init_arg ) ) { - if (exists $params{$init_arg}) { - $clone->{ $attr->name } = $params{$init_arg}; - } - } - } + my $cloned = bless { %$object }, ref $object; + $class->_initialize_object($cloned, \%params); - return $clone; + return $cloned; } sub clone_instance { @@ -409,7 +407,7 @@ sub does_role { || $self->throw_error("You must supply a role name to look for"); for my $class ($self->linearized_isa) { - my $meta = Mouse::Meta::Module::class_of($class); + my $meta = Mouse::Util::get_metaclass_by_name($class); next unless $meta && $meta->can('roles'); for my $role (@{ $meta->roles }) {