X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FRole.pm;h=85fcf281cfe54ecacb33d3c45e032d9139d55a56;hb=bb09ad9144e7ee7b2cad8a90725267f591346406;hp=b0d7a9b47e514b770a7b2136f36af625eea5482f;hpb=2e7576bdd6c4a179beadc2d21623c6cad1d66469;p=gitmo%2FMoose.git diff --git a/lib/Moose/Role.pm b/lib/Moose/Role.pm index b0d7a9b..85fcf28 100644 --- a/lib/Moose/Role.pm +++ b/lib/Moose/Role.pm @@ -7,7 +7,7 @@ use Carp 'croak'; use Sub::Exporter; -our $VERSION = '0.96'; +our $VERSION = '1.17'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -50,16 +50,13 @@ sub has { sub _add_method_modifier { my $type = shift; my $meta = shift; - my $code = pop @_; - - for (@_) { - croak "Roles do not currently support " - . ref($_) - . " references for $type method modifiers" - if ref $_; - my $add_method = "add_${type}_method_modifier"; - $meta->$add_method( $_, $code ); + + if ( ref($_[0]) eq 'Regexp' ) { + croak "Roles do not currently support regex " + . " references for $type method modifiers"; } + + Moose::Util::add_method_modifier($meta, $type, \@_); } sub before { _add_method_modifier('before', @_) } @@ -111,29 +108,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; @@ -181,7 +191,7 @@ serves as API documentation. =head1 EXPORTED FUNCTIONS Moose::Role currently supports all of the functions that L exports, but -differs slightly in how some items are handled (see L below for +differs slightly in how some items are handled (see L below for details). Moose::Role also offers two role-specific keyword exports: