$meta = $metaclass->initialize($class);
}
- unless ( $meta->has_method("meta") ) { # don't overwrite
+ unless ($args{no_meta}) {
# also check for inherited non moose 'meta' method?
- # FIXME also skip this if the user requested by passing an option
+ my $existing = $meta->get_method('meta');
+ if ($existing && !$existing->isa('Class::MOP::Method::Meta')) {
+ warn "Moose is overwriting an existing method named 'meta' "
+ . "with its own version, in class $class. If this is actually "
+ . "what you want, you should remove the existing method, "
+ . "otherwise, you should pass the '-no_meta => 1' option to "
+ . "'use Moose'.";
+ }
$meta->_add_meta_method;
}
= Moose::Util::resolve_metaclass_alias( 'Class' => $metaclass )
if defined $metaclass && length $metaclass;
+ my $no_meta;
+ ( $no_meta, @_ ) = _strip_no_meta(@_);
+
# Normally we could look at $_[0], but in some weird cases
# (involving goto &Moose::import), $_[0] ends as something
# else (like Squirrel).
# Moose::Exporter, which in turn sets $CALLER, so we need
# to protect against that.
local $CALLER = $CALLER;
- $c->init_meta( for_class => $CALLER, metaclass => $metaclass );
+ $c->init_meta(
+ for_class => $CALLER,
+ metaclass => $metaclass,
+ no_meta => $no_meta,
+ );
$did_init_meta = 1;
}
return ( $metaclass, @_ );
}
+sub _strip_no_meta {
+ my $idx = first_index { $_ eq '-no_meta' } @_;
+
+ return ( undef, @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
+
+ my $no_meta = $_[ $idx + 1 ];
+
+ splice @_, $idx, 2;
+
+ return ( $no_meta, @_ );
+}
+
sub _apply_meta_traits {
my ( $class, $traits ) = @_;
$meta = $metaclass->initialize($role);
}
- unless ( $meta->has_method("meta") ) { # don't overwrite
+ unless ($args{no_meta}) {
# also check for inherited non moose 'meta' method?
- # FIXME also skip this if the user requested by passing an option
+ my $existing = $meta->get_method('meta');
+ if ($existing && !$existing->isa('Class::MOP::Method::Meta')) {
+ warn "Moose::Role is overwriting an existing method named 'meta' "
+ . "with its own version, in role $role. If this is actually "
+ . "what you want, you should remove the existing method, "
+ . "otherwise, you should pass the '-no_meta => 1' option to "
+ . "'use Moose::Role'.";
+ }
$meta->_add_meta_method;
}