From: Yuval Kogman Date: Sun, 10 Aug 2008 17:42:29 +0000 (+0000) Subject: add associated_metaclass to Method X-Git-Tag: 0_64_01~55 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5e607260c836a5f08e30867701738be2d151a535;p=gitmo%2FClass-MOP.git add associated_metaclass to Method --- diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index 4af7900..8667238 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -545,6 +545,13 @@ Class::MOP::Method->meta->add_attribute( ); Class::MOP::Method->meta->add_attribute( + Class::MOP::Attribute->new('associated_metaclass' => ( + init_arg => 'associated_metaclass', + reader => { 'associated_metaclass' => \&Class::MOP::Method::associated_metaclass }, + )) +); + +Class::MOP::Method->meta->add_attribute( Class::MOP::Attribute->new('package_name' => ( init_arg => 'package_name', reader => { 'package_name' => \&Class::MOP::Method::package_name }, diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index c80b00c..63636ba 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -360,8 +360,9 @@ sub get_method_map { $map->{$symbol} = $method_metaclass->wrap( $code, - package_name => $class_name, - name => $symbol, + associated_metaclass => $self, + package_name => $class_name, + name => $symbol, ); } @@ -635,6 +636,9 @@ sub add_method { ) ); } + + $method->attach_to_class($self); + $self->get_method_map->{$method_name} = $method; my $full_method_name = ($self->name . '::' . $method_name); @@ -764,6 +768,8 @@ sub remove_method { { sigil => '&', type => 'CODE', name => $method_name } ); + $removed_method->detach_from_class if $removed_method; + $self->update_package_cache_flag; # still valid, since we just removed the method from the map return $removed_method; diff --git a/lib/Class/MOP/Method.pm b/lib/Class/MOP/Method.pm index 76167fe..8a2dc88 100644 --- a/lib/Class/MOP/Method.pm +++ b/lib/Class/MOP/Method.pm @@ -5,7 +5,7 @@ use strict; use warnings; use Carp 'confess'; -use Scalar::Util 'blessed'; +use Scalar::Util 'weaken'; our $VERSION = '0.65'; our $AUTHORITY = 'cpan:STEVAN'; @@ -42,20 +42,34 @@ sub wrap { ($params{package_name} && $params{name}) || confess "You must supply the package_name and name parameters $UPGRADE_ERROR_TEXT"; - bless { - 'body' => $code, - 'package_name' => $params{package_name}, - 'name' => $params{name}, - } => blessed($class) || $class; + my $self = bless { + 'body' => $code, + 'associated_metaclass' => $params{associated_metaclass}, + 'package_name' => $params{package_name}, + 'name' => $params{name}, + } => ref($class) || $class; + + weaken($self->{associated_metaclass}) if $self->{associated_metaclass}; + + return $self; } ## accessors sub body { (shift)->{'body'} } -# TODO - add associated_class +sub associated_metaclass { shift->{'associated_metaclass'} } -# informational +sub attach_to_class { + my ( $self, $class ) = @_; + $self->{associated_metaclass} = $class; + weaken($self->{associated_metaclass}); +} + +sub detach_from_class { + my $self = shift; + delete $self->{associated_metaclass}; +} sub package_name { my $self = shift; @@ -138,6 +152,10 @@ This returns the actual CODE reference of the particular instance. This returns the name of the CODE reference. +=item B + +The metaclass of the method + =item B This returns the package name that the CODE reference is attached to. @@ -148,6 +166,20 @@ This returns the fully qualified name of the CODE reference. =back +=head2 Metaclass + +=over 4 + +=item B + +Sets the associated metaclass + +=item B + +Disassociates the method from the metaclass + +=back + =head1 AUTHORS Stevan Little Estevan@iinteractive.comE