X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=07203c376c51c7e394e4aede792a8b2433c8d940;hb=fdec46ff3fe73d4026211a06966d9320b222ea26;hp=870b69d9c5f260606ed41ab1892a38737f75fcbc;hpb=69ac1dcfa408b64733ba3d2e47e8e791e4548f95;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 870b69d..07203c3 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -48,12 +48,38 @@ sub get_attribute { $_[0]->{attributes}->{$_[1]} } sub apply { my $self = shift; my $class = shift; - my $pkg = $class->name; for my $name ($self->get_attribute_list) { + next if $class->has_attribute($name); my $spec = $self->get_attribute($name); - Mouse::Meta::Attribute->create($pkg, $name, %$spec); + Mouse::Meta::Attribute->create($class, $name, %$spec); } + + for my $modifier_type (qw/before after around/) { + my $add_method = "add_${modifier_type}_method_modifier"; + my $modified = $self->{"${modifier_type}_method_modifiers"}; + + for my $method_name (keys %$modified) { + for my $code (@{ $modified->{$method_name} }) { + $class->$add_method($method_name => $code); + } + } + } +} + +for my $modifier_type (qw/before after around/) { + no strict 'refs'; + *{ __PACKAGE__ . '::' . "add_${modifier_type}_method_modifier" } = sub { + my ($self, $method_name, $method) = @_; + + push @{ $self->{"${modifier_type}_method_modifiers"}->{$method_name} }, + $method; + }; + + *{ __PACKAGE__ . '::' . "get_${modifier_type}_method_modifiers" } = sub { + my ($self, $method_name, $method) = @_; + @{ $self->{"${modifier_type}_method_modifiers"}->{$method_name} || [] } + }; } 1;