X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FRole.pm;h=1c685ed10662c6fd17ab8f287877141f4bccbec0;hb=5394a1c721689ae6c3168a22dd92a0499e8d9744;hp=43e1a796c806adb998df7155df8d52ddd3c8b766;hpb=e462f6f3d260687b8f7372b112a50c5c2a2c431c;p=gitmo%2FMoose.git diff --git a/lib/Moose/Role.pm b/lib/Moose/Role.pm index 43e1a79..1c685ed 100644 --- a/lib/Moose/Role.pm +++ b/lib/Moose/Role.pm @@ -7,7 +7,7 @@ use Carp 'croak'; use Sub::Exporter; -our $VERSION = '1.05'; +our $VERSION = '1.15'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -111,29 +111,42 @@ sub init_meta { } my $metaclass = $args{metaclass} || "Moose::Meta::Role"; + my $meta_name = exists $args{meta_name} ? $args{meta_name} : 'meta'; - # make a subtype for each Moose class + Moose->throw_error("The Metaclass $metaclass must be a subclass of Moose::Meta::Role.") + unless $metaclass->isa('Moose::Meta::Role'); + + # make a subtype for each Moose role role_type $role unless find_type_constraint($role); - # FIXME copy from Moose.pm my $meta; - if ($role->can('meta')) { - $meta = $role->meta(); - - unless ( blessed($meta) && $meta->isa('Moose::Meta::Role') ) { - require Moose; - Moose->throw_error("You already have a &meta function, but it does not return a Moose::Meta::Role"); + if ( $meta = Class::MOP::get_metaclass_by_name($role) ) { + unless ( $meta->isa("Moose::Meta::Role") ) { + my $error_message = "$role already has a metaclass, but it does not inherit $metaclass ($meta)."; + if ( $meta->isa('Moose::Meta::Class') ) { + Moose->throw_error($error_message . ' You cannot make the same thing a role and a class. Remove either Moose or Moose::Role.'); + } else { + Moose->throw_error($error_message); + } } } else { $meta = $metaclass->initialize($role); + } - $meta->add_method( - 'meta' => sub { - # re-initialize so it inherits properly - $metaclass->initialize( ref($_[0]) || $_[0] ); - } - ); + if (defined $meta_name) { + # also check for inherited non moose 'meta' method? + 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;