X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FMethod%2FMeta.pm;h=e339832d9d6f195f22e1717aa8bed7543e80dab5;hb=28a82ddae9835be042c809198885582ba32b9583;hp=1a14fe4379090afeef35866046707806540a5e2a;hpb=59b510466ab075526c10a9c0555645b5f916ef02;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Method/Meta.pm b/lib/Class/MOP/Method/Meta.pm index 1a14fe4..e339832 100644 --- a/lib/Class/MOP/Method/Meta.pm +++ b/lib/Class/MOP/Method/Meta.pm @@ -15,24 +15,25 @@ use constant DEBUG_NO_META => $ENV{DEBUG_NO_META}; use base 'Class::MOP::Method'; +sub _is_caller_mop_internal { + my $self = shift; + my ($caller) = @_; + return $caller =~ /^(?:Class::MOP|metaclass)(?:::|$)/; +} + sub _generate_meta_method { my $method_self = shift; my $metaclass = shift; sub { # this will be compiled out if the env var wasn't set if (DEBUG_NO_META) { - my ($self) = @_; - # it's okay if we installed a meta method in a subclass of a class - # with a legitimate meta method (we'll still die if we install a - # meta method in a subclass of a class we installed a meta method - # in, since this function is itself defined in Class::MOP) - #if (my $meta = try { $self->SUPER::meta }) { - #return $meta if $meta->isa('Class::MOP::Class'); - #} - # it's okay if the test itself calls ->meta, we only care about if - # the mop internals call ->meta confess "'meta' method called by MOP internals" - if caller =~ /^(?:Class::MOP|metaclass)(?:::|$)/; + # it's okay to call meta methods on metaclasses, since we + # explicitly ask for them + if !$_[0]->isa('Class::MOP::Object') + # it's okay if the test itself calls ->meta, we only care about + # if the mop internals call ->meta + && $method_self->_is_caller_mop_internal(scalar caller); } # we must re-initialize so that it # works as expected in subclasses,