Fix native methods which accept string to accept the empty string
[gitmo/Moose.git] / lib / Moose / Role.pm
index bdb1769..1c685ed 100644 (file)
@@ -7,7 +7,7 @@ use Carp         'croak';
 
 use Sub::Exporter;
 
-our $VERSION   = '1.14';
+our $VERSION   = '1.15';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -111,6 +111,7 @@ sub init_meta {
     }
 
     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');
@@ -133,15 +134,19 @@ sub init_meta {
         $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;