X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=79f3b7fc697070fb99d277a3a06a69d4ce6251f7;hb=fc0e0bbda277a99354170a4b8de6eb1275920555;hp=8e42641c0ff7fd594c2095aff8f01ac11c205cce;hpb=da0c885dc9a21cad4c372d28c1dd6ef0813cc0bd;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 8e42641..79f3b7f 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -27,26 +27,48 @@ sub new { my $class = shift; my %args = @_; + $args{attributes} ||= {}; + bless \%args, $class; } sub name { $_[0]->{name} } -sub has_attribute { exists $_[0]->{attributes}->{$_[1]} } -sub add_attribute { $_[0]->{attributes}->{$_[1]} = $_[2] } -sub get_attribute_list { +sub add_attribute { + my $self = shift; + my $name = shift; + my $spec = shift; + $self->{attributes}->{$name} = $spec; } +sub has_attribute { exists $_[0]->{attributes}->{$_[1]} } +sub get_attribute_list { keys %{ $_[0]->{attributes} } } +sub get_attribute { $_[0]->{attributes}->{$_[1]} } + sub apply { my $self = shift; my $class = shift; - my $pkg = shift; for my $name ($self->get_attribute_list) { - my $attr = $self->get_attribute($name); - Mouse::Meta::Attribute->create($pkg, $name, $attr); + next if $class->has_attribute($name); + my $spec = $self->get_attribute($name); + Mouse::Meta::Attribute->create($class, $name, %$spec); } +} + +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;