X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=2ea38e237658e7a07963b8e9246705e405f27102;hb=11d415286701d3b51e517cb6826138808967cb89;hp=f7ebd21a2d521e74e56a8009cd241e14e36f8ba3;hpb=6719984210754e8d012ae678536f194c35000823;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index f7ebd21..2ea38e2 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -2,6 +2,8 @@ package Mouse::Meta::Role; use strict; use warnings; use Carp 'confess'; + +use Mouse::Meta::Attribute; use Mouse::Util qw(version authority identifier); do { @@ -49,7 +51,7 @@ sub add_attribute { my $self = shift; my $name = shift; my $spec = shift; - $self->{attributes}->{$name} = $spec; + $self->{attributes}->{$name} = Mouse::Meta::Attribute->new($name, %$spec); } sub has_attribute { exists $_[0]->{attributes}->{$_[1]} } @@ -64,12 +66,13 @@ sub get_method_list { no strict 'refs'; # Get all the CODE symbol table entries my @functions = - grep !/^(?:has|with|around|before|after|blessed|extends|confess|excludes|meta|requires)$/, + grep !/^(?:has|with|around|before|after|augment|inner|override|super|blessed|extends|confess|excludes|meta|requires)$/, grep { defined &{"${name}::$_"} } keys %{"${name}::"}; wantarray ? @functions : \@functions; } +# Moose uses Application::ToInstance, Application::ToClass, Application::ToRole sub apply { my $self = shift; my $selfname = $self->name; @@ -77,6 +80,10 @@ sub apply { my $classname = $class->name; my %args = @_; + if ($class->isa('Mouse::Object')) { + Carp::croak('Mouse does not support Application::ToInstance yet'); + } + if ($class->isa('Mouse::Meta::Class')) { for my $name (@{$self->{required_methods}}) { unless ($classname->can($name)) { @@ -96,12 +103,12 @@ sub apply { # XXX what's Moose's behavior? #next; } else { - *$class_function = *$role_function; + *{$class_function} = \&{$role_function}; } if ($args{alias} && $args{alias}->{$name}) { my $dstname = $args{alias}->{$name}; unless ($classname->can($dstname)) { - *{"${classname}::${dstname}"} = *$role_function; + *{"${classname}::${dstname}"} = \&$role_function; } } } @@ -192,7 +199,7 @@ sub combine_apply { if ($args{alias} && $args{alias}->{$name}) { my $dstname = $args{alias}->{$name}; unless ($classname->can($dstname)) { - *{"${classname}::${dstname}"} = *$role_function; + *{"${classname}::${dstname}"} = \&$role_function; } } }