X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=90370443e3716c13df4cd008281c69778ede0a9f;hp=ebb929fe0a7c68a51ee0b81fcdf8bca1166db943;hb=2e92bb89f22acc49ce81b6ec6593d6190559ac45;hpb=59089ec36675c7df1998945b1446c37794f88306 diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index ebb929f..9037044 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -53,13 +53,41 @@ sub has_attribute { exists $_[0]->{attributes}->{$_[1]} } sub get_attribute_list { keys %{ $_[0]->{attributes} } } sub get_attribute { $_[0]->{attributes}->{$_[1]} } +# copied from Class::Inspector +sub get_method_list { + my $self = shift; + my $name = $self->name; + + no strict 'refs'; + # Get all the CODE symbol table entries + my @functions = grep !/^meta$/, + grep { /\A[^\W\d]\w*\z/o } + grep { defined &{"${name}::$_"} } + keys %{"${name}::"}; + wantarray ? @functions : \@functions; +} + sub apply { my $self = shift; + my $selfname = $self->name; my $class = shift; + my $classname = $class->name; for my $name (@{$self->{required_methods}}) { - unless ($class->name->can($name)) { - confess "'@{[ $self->name ]}' requires the method '$name' to be implemented by '@{[ $class->name ]}'"; + unless ($classname->can($name)) { + confess "'$selfname' requires the method '$name' to be implemented by '$classname'"; + } + } + + { + 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'; + if ($classname->can($name)) { + # XXX what's Moose's behavior? + next; + } + *{"${classname}::${name}"} = *{"${selfname}::${name}"}; } }