use Sub::Exporter;
-our $VERSION = '1.14';
+our $VERSION = '1.15';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
}
my $metaclass = $args{metaclass} || "Moose::Meta::Role";
+ my $meta_name = exists $args{meta_name} ? $args{meta_name} : 'meta';
Moose->throw_error("The Metaclass $metaclass must be a subclass of Moose::Meta::Role.")
unless $metaclass->isa('Moose::Meta::Role');
$meta = $metaclass->initialize($role);
}
- unless ( $meta->has_method("meta") ) { # don't overwrite
+ if (defined $meta_name) {
# also check for inherited non moose 'meta' method?
- # FIXME also skip this if the user requested by passing an option
- $meta->add_method(
- 'meta' => sub {
- # re-initialize so it inherits properly
- $metaclass->initialize( ref($_[0]) || $_[0] );
- }
- );
+ my $existing = $meta->get_method($meta_name);
+ if ($existing && !$existing->isa('Class::MOP::Method::Meta')) {
+ Carp::cluck "Moose::Role is overwriting an existing method named "
+ . "$meta_name in role $role with a method "
+ . "which returns the class's metaclass. If this is "
+ . "actually what you want, you should remove the "
+ . "existing method, otherwise, you should rename or "
+ . "disable this generated method using the "
+ . "'-meta_name' option to 'use Moose::Role'.";
+ }
+ $meta->_add_meta_method($meta_name);
}
return $meta;