X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FAttribute.pm;h=1f7e0178677d2ab04df0c1245b63abbfca672438;hb=df8260e9a27a9d7532a21525223975fcf8e26562;hp=564adbde27f04c7c51b239f788f36b041ac18a87;hpb=18748ad69a205a0ae4acea224d69f10f3db53834;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Attribute.pm b/lib/Moose/Meta/Attribute.pm index 564adbd..1f7e017 100644 --- a/lib/Moose/Meta/Attribute.pm +++ b/lib/Moose/Meta/Attribute.pm @@ -7,7 +7,7 @@ use warnings; use Scalar::Util 'blessed', 'weaken'; use overload (); -our $VERSION = '0.57'; +our $VERSION = '0.63'; our $AUTHORITY = 'cpan:STEVAN'; use Moose::Meta::Method::Accessor; @@ -61,7 +61,7 @@ sub does { Moose::Util::resolve_metatrait_alias(Attribute => $role_name) }; return 0 if !defined($name); # failed to load class - return Moose::Object::does($self, $name); + return $self->Moose::Object::does($name); } sub throw_error { @@ -523,7 +523,7 @@ sub get_value { $value = $type_constraint->coerce($value) if ($self->should_coerce); $type_constraint->check($value) - || c$self->throw_error("Attribute (" . $self->name + || $self->throw_error("Attribute (" . $self->name . ") does not pass the type constraint because: " . $type_constraint->get_message($value), type_constraint => $type_constraint, data => $value); } @@ -567,6 +567,13 @@ sub install_accessors { return; } +sub remove_accessors { + my $self = shift; + $self->SUPER::remove_accessors(@_); + $self->remove_delegation if $self->has_handles; + return; +} + sub install_delegation { my $self = shift; @@ -604,6 +611,15 @@ sub install_delegation { } } +sub remove_delegation { + my $self = shift; + my %handles = $self->_canonicalize_handles; + my $associated_class = $self->associated_class; + foreach my $handle (keys %handles) { + $self->associated_class->remove_method($handle); + } +} + # private methods to help delegation ... sub _canonicalize_handles { @@ -630,6 +646,9 @@ sub _canonicalize_handles { } } else { + Class::MOP::load_class($handles) + unless Class::MOP::is_class_loaded($handles); + my $role_meta = eval { $handles->meta }; if ($@) { $self->throw_error("Unable to canonicalize the 'handles' option with $handles because : $@", data => $handles, error => $@); @@ -637,7 +656,7 @@ sub _canonicalize_handles { (blessed $role_meta && $role_meta->isa('Moose::Meta::Role')) || $self->throw_error("Unable to canonicalize the 'handles' option with $handles because ->meta is not a Moose::Meta::Role", data => $handles); - + return map { $_ => $_ } ( $role_meta->get_method_list, $role_meta->get_required_method_list @@ -742,8 +761,12 @@ will behave just as L does. =item B +=item B + =item B +=item B + =item B =item B