);
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 },
$map->{$symbol} = $method_metaclass->wrap(
$code,
- package_name => $class_name,
- name => $symbol,
+ associated_metaclass => $self,
+ package_name => $class_name,
+ name => $symbol,
);
}
)
);
}
+
+ $method->attach_to_class($self);
+
$self->get_method_map->{$method_name} = $method;
my $full_method_name = ($self->name . '::' . $method_name);
{ 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;
use warnings;
use Carp 'confess';
-use Scalar::Util 'blessed';
+use Scalar::Util 'weaken';
our $VERSION = '0.65';
our $AUTHORITY = 'cpan:STEVAN';
($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;
This returns the name of the CODE reference.
+=item B<associated_metaclass>
+
+The metaclass of the method
+
=item B<package_name>
This returns the package name that the CODE reference is attached to.
=back
+=head2 Metaclass
+
+=over 4
+
+=item B<attach_to_class>
+
+Sets the associated metaclass
+
+=item B<detach_from_class>
+
+Disassociates the method from the metaclass
+
+=back
+
=head1 AUTHORS
Stevan Little E<lt>stevan@iinteractive.comE<gt>