X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=0e1d667a242a7833ab4fc6a9fbd9dd0f4344ef92;hb=b6ffa107ada7a537575481d277818e207ed219fb;hp=90370443e3716c13df4cd008281c69778ede0a9f;hpb=2e92bb89f22acc49ce81b6ec6593d6190559ac45;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 9037044..0e1d667 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -72,10 +72,13 @@ sub apply { my $selfname = $self->name; my $class = shift; my $classname = $class->name; + my %args = @_; - for my $name (@{$self->{required_methods}}) { - unless ($classname->can($name)) { - confess "'$selfname' requires the method '$name' to be implemented by '$classname'"; + if ($class->isa('Mouse::Meta::Class')) { + for my $name (@{$self->{required_methods}}) { + unless ($classname->can($name)) { + confess "'$selfname' requires the method '$name' to be implemented by '$classname'"; + } } } @@ -83,20 +86,33 @@ 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'; - if ($classname->can($name)) { + my $dstname = $args{alias} ? ($args{alias}->{$name}||$name) : $name; + if ($classname->can($dstname)) { # XXX what's Moose's behavior? next; } - *{"${classname}::${name}"} = *{"${selfname}::${name}"}; + *{"${classname}::${dstname}"} = *{"${selfname}::${name}"}; } } - 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); + if ($class->isa('Mouse::Meta::Class')) { + # apply role to class + 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); + } + } else { + # apply role to role + # XXX Room for speed improvement + for my $name ($self->get_attribute_list) { + next if $class->has_attribute($name); + my $spec = $self->get_attribute($name); + $class->add_attribute($name, $spec); + } } + # XXX Room for speed improvement in role to role for my $modifier_type (qw/before after around/) { my $add_method = "add_${modifier_type}_method_modifier"; my $modified = $self->{"${modifier_type}_method_modifiers"};