X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=e82690daa51aa3b3238507ef7a3557d3565a62ab;hb=05b9dc92e107117921170e662967d5d2101db21b;hp=2ce294c14f277fb8ec9f3977f32f753f0fc1c3a6;hpb=21498b08feb4f9e5f74670eafe293adcbf3cdd29;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 2ce294c..e82690d 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -1,8 +1,8 @@ -#!/usr/bin/env perl package Mouse::Meta::Role; use strict; use warnings; use Carp 'confess'; +use Mouse::Util; do { my %METACLASS_CACHE; @@ -61,8 +61,8 @@ sub get_method_list { no strict 'refs'; # Get all the CODE symbol table entries - my @functions = grep !/^meta$/, - grep { /\A[^\W\d]\w*\z/o } + my @functions = + grep !/^(?:has|with|around|before|after|blessed|extends|confess|excludes|meta|requires)$/, grep { defined &{"${name}::$_"} } keys %{"${name}::"}; wantarray ? @functions : \@functions; @@ -86,7 +86,7 @@ sub apply { { no strict 'refs'; for my $name ($self->get_method_list) { - next if $name eq 'has' || $name eq 'requires' || $name eq 'meta' || $name eq 'with' || $name eq 'around' || $name eq 'before' || $name eq 'after' || $name eq 'blessed' || $name eq 'extends' || $name eq 'confess' || $name eq 'excludes'; + next if $name eq 'meta'; if ($classname->can($name)) { # XXX what's Moose's behavior? @@ -108,7 +108,19 @@ sub apply { for my $name ($self->get_attribute_list) { next if $class->has_attribute($name); my $spec = $self->get_attribute($name); - Mouse::Meta::Attribute->create($class, $name, %$spec); + + my $metaclass = 'Mouse::Meta::Attribute'; + if ( my $metaclass_name = $spec->{metaclass} ) { + my $new_class = Mouse::Util::resolve_metaclass_alias( + 'Attribute', + $metaclass_name + ); + if ( $metaclass ne $new_class ) { + $metaclass = $new_class; + } + } + + $metaclass->create($class, $name, %$spec); } } else { # apply role to role @@ -163,7 +175,7 @@ sub combine_apply { my $selfname = $self->name; my %args = %{ $role_spec->[1] }; for my $name ($self->get_method_list) { - next if $name eq 'has' || $name eq 'requires' || $name eq 'meta' || $name eq 'with' || $name eq 'around' || $name eq 'before' || $name eq 'after' || $name eq 'blessed' || $name eq 'extends' || $name eq 'confess' || $name eq 'excludes'; + next if $name eq 'meta'; if ($classname->can($name)) { # XXX what's Moose's behavior? @@ -189,7 +201,19 @@ sub combine_apply { for my $name ($self->get_attribute_list) { next if $class->has_attribute($name); my $spec = $self->get_attribute($name); - Mouse::Meta::Attribute->create($class, $name, %$spec); + + my $metaclass = 'Mouse::Meta::Attribute'; + if ( my $metaclass_name = $spec->{metaclass} ) { + my $new_class = Mouse::Util::resolve_metaclass_alias( + 'Attribute', + $metaclass_name + ); + if ( $metaclass ne $new_class ) { + $metaclass = $new_class; + } + } + + $metaclass->create($class, $name, %$spec); } } } else {