),
);
+## --------------------------------------------------------
+## Class::MOP::Object
+
+# need to replace the meta method there with a real meta method object
+Class::MOP::Object->meta->_add_meta_method;
+
require Class::MOP::Deprecated unless our $no_deprecated;
# we need the meta instance of the meta instance to be created now, in order
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,