From: Shawn M Moore Date: Wed, 16 Jul 2008 06:29:26 +0000 (+0000) Subject: Keep track of the instantiated metaclass in associated_class, use the MOP better... X-Git-Tag: 0.19~241 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=commitdiff_plain;h=724c77c0fd7afe685c69dc1abcfc8b1a79eefae3 Keep track of the instantiated metaclass in associated_class, use the MOP better, etc --- diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 2df3ba1..c6013e9 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -33,17 +33,20 @@ do { }, has => sub { + my $caller = $CALLER; + return sub { - my $package = caller; + my $meta = $caller->meta; + my $names = shift; $names = [$names] if !ref($names); for my $name (@$names) { if ($name =~ s/^\+//) { - Mouse::Meta::Attribute->clone_parent($package, $name, @_); + Mouse::Meta::Attribute->clone_parent($meta, $name, @_); } else { - Mouse::Meta::Attribute->create($package, $name, @_); + Mouse::Meta::Attribute->create($meta, $name, @_); } } }; diff --git a/lib/Mouse/Meta/Attribute.pm b/lib/Mouse/Meta/Attribute.pm index 0d7f824..3deea32 100644 --- a/lib/Mouse/Meta/Attribute.pm +++ b/lib/Mouse/Meta/Attribute.pm @@ -4,7 +4,7 @@ use strict; use warnings; use Carp 'confess'; -use Scalar::Util 'blessed'; +use Scalar::Util qw/blessed weaken/; sub new { my $class = shift; @@ -193,17 +193,15 @@ sub create { if exists $args{isa}; my $attribute = $self->new(%args); - $attribute->_create_args(\%args); - my $meta = $class->meta; + $attribute->_create_args(\%args); - $meta->add_attribute($attribute); + $class->add_attribute($attribute); # install an accessor if ($attribute->_is_metadata eq 'rw' || $attribute->_is_metadata eq 'ro') { my $accessor = $attribute->generate_accessor; - no strict 'refs'; - *{ $class . '::' . $name } = $accessor; + $class->add_method($name => $accessor); } for my $method (qw/predicate clearer/) { @@ -211,16 +209,14 @@ sub create { if ($attribute->$predicate) { my $generator = "generate_$method"; my $coderef = $attribute->$generator; - no strict 'refs'; - *{ $class . '::' . $attribute->$method } = $coderef; + $class->add_method($attribute->$method => $coderef); } } if ($attribute->has_handles) { my $method_map = $attribute->generate_handles; for my $method_name (keys %$method_map) { - no strict 'refs'; - *{ $class . '::' . $method_name } = $method_map->{$method_name}; + $class->add_method($method_name => $method_map->{$method_name}); } } @@ -345,7 +341,7 @@ sub get_parent_args { my $class = shift; my $name = shift; - for my $super ($class->meta->linearized_isa) { + for my $super ($class->linearized_isa) { my $super_attr = $super->can("meta") && $super->meta->get_attribute($name) or next; return %{ $super_attr->_create_args }; diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 9b4aec5..f4bf289 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -48,12 +48,11 @@ sub get_attribute { $_[0]->{attributes}->{$_[1]} } sub apply { my $self = shift; my $class = shift; - my $pkg = $class->name; for my $name ($self->get_attribute_list) { next if $class->has_attribute($name); my $spec = $self->get_attribute($name); - Mouse::Meta::Attribute->create($pkg, $name, %$spec); + Mouse::Meta::Attribute->create($class, $name, %$spec); } } diff --git a/t/101-meta-attribute.t b/t/101-meta-attribute.t index f32db9d..7bd36cd 100644 --- a/t/101-meta-attribute.t +++ b/t/101-meta-attribute.t @@ -25,7 +25,7 @@ isa_ok($attr, 'Mouse::Meta::Attribute'); can_ok($attr, qw(name associated_class predicate clearer)); is($attr->name, 'pawn', 'attribute name'); -is($attr->associated_class, 'Class', 'associated_class'); +is($attr->associated_class, Class->meta, 'associated_class'); is($attr->predicate, 'has_pawn', 'predicate'); is($attr->clearer, 'clear_pawn', 'clearer'); ok(!$attr->is_lazy_build, "not lazy_build");