X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FUtil.pm;h=f7875783753b15fd31241ab995691f991f82f435;hb=aead17e74252e3884f9f8e39912ca98fdf4b4dd5;hp=95cea17472b7cf01938582b6e3b568edfaf1ca09;hpb=5f71050b357fb1966e206920a5853779f58516a9;p=gitmo%2FMoose.git diff --git a/lib/Moose/Util.pm b/lib/Moose/Util.pm index 95cea17..f787578 100644 --- a/lib/Moose/Util.pm +++ b/lib/Moose/Util.pm @@ -5,10 +5,10 @@ use warnings; use Sub::Exporter; use Scalar::Util 'blessed'; -use Carp 'confess'; -use Class::MOP 0.56; +use Class::MOP 0.60; -our $VERSION = '0.06'; +our $VERSION = '0.62'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; my @exports = qw[ @@ -71,33 +71,30 @@ sub search_class_by_role { sub apply_all_roles { my $applicant = shift; - - confess "Must specify at least one role to apply to $applicant" unless @_; - - my $roles = Data::OptList::mkopt([ @_ ]); - - #use Data::Dumper; - #warn Dumper $roles; - - my $meta = (blessed $applicant ? $applicant : find_meta($applicant)); - + + Moose->throw_error("Must specify at least one role to apply to $applicant") unless @_; + + my $roles = Data::OptList::mkopt( [@_] ); + + my $meta = ( blessed $applicant ? $applicant : find_meta($applicant) ); + foreach my $role_spec (@$roles) { - Class::MOP::load_class($role_spec->[0]); + Class::MOP::load_class( $role_spec->[0] ); } - - ($_->[0]->can('meta') && $_->[0]->meta->isa('Moose::Meta::Role')) - || confess "You can only consume roles, " . $_->[0] . " is not a Moose role" - foreach @$roles; - if (scalar @$roles == 1) { - my ($role, $params) = @{$roles->[0]}; - $role->meta->apply($meta, (defined $params ? %$params : ())); + ( $_->[0]->can('meta') && $_->[0]->meta->isa('Moose::Meta::Role') ) + || Moose->throw_error("You can only consume roles, " + . $_->[0] + . " is not a Moose role") + foreach @$roles; + + if ( scalar @$roles == 1 ) { + my ( $role, $params ) = @{ $roles->[0] }; + $role->meta->apply( $meta, ( defined $params ? %$params : () ) ); } else { - Moose::Meta::Role->combine( - @$roles - )->apply($meta); - } + Moose::Meta::Role->combine( @$roles )->apply($meta); + } } # instance deconstruction ... @@ -122,25 +119,35 @@ sub get_all_init_args { } sub resolve_metatrait_alias { - resolve_metaclass_alias( @_, trait => 1 ); + return resolve_metaclass_alias( @_, trait => 1 ); } -sub resolve_metaclass_alias { - my ( $type, $metaclass_name, %options ) = @_; +{ + my %cache; + + sub resolve_metaclass_alias { + my ( $type, $metaclass_name, %options ) = @_; + + my $cache_key = $type . q{ } . ( $options{trait} ? '-Trait' : '' ); + return $cache{$cache_key}{$metaclass_name} + if $cache{$cache_key}{$metaclass_name}; - if ( my $resolved = eval { - my $possible_full_name = 'Moose::Meta::' . $type . '::Custom::' . ( $options{trait} ? "Trait::" : "" ) . $metaclass_name; + my $possible_full_name + = 'Moose::Meta::' + . $type + . '::Custom::' + . ( $options{trait} ? "Trait::" : "" ) + . $metaclass_name; - Class::MOP::load_class($possible_full_name); + my $loaded_class = Class::MOP::load_first_existing_class( + $possible_full_name, + $metaclass_name + ); - $possible_full_name->can('register_implementation') - ? $possible_full_name->register_implementation - : $possible_full_name; - } ) { - return $resolved; - } else { - Class::MOP::load_class($metaclass_name); - return $metaclass_name; + return $cache{$cache_key}{$metaclass_name} + = $loaded_class->can('register_implementation') + ? $loaded_class->register_implementation + : $loaded_class; } } @@ -151,10 +158,10 @@ sub add_method_modifier { my $add_modifier_method = 'add_' . $modifier_name . '_method_modifier'; if ( my $method_modifier_type = ref( @{$args}[0] ) ) { if ( $method_modifier_type eq 'Regexp' ) { - my @all_methods = $meta->compute_all_applicable_methods; + my @all_methods = $meta->get_all_methods; my @matched_methods - = grep { $_->{name} =~ @{$args}[0] } @all_methods; - $meta->$add_modifier_method( $_->{name}, $code ) + = grep { $_->name =~ @{$args}[0] } @all_methods; + $meta->$add_modifier_method( $_->name, $code ) for @matched_methods; } }