X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=0c04b7421018a54dca10a3f0355b1289c7ffbd1f;hb=c2f128e7c8795ef8115bbfe99aae1f19960903e8;hp=181578ad36c068a67482d2f6ca7a9f262d8821fa;hpb=a2227e71332a3c0e26445c14c7bb596eb06dbc92;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 181578a..0c04b74 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -3,6 +3,66 @@ package Mouse::Meta::Role; use strict; use warnings; +do { + my %METACLASS_CACHE; + + # because Mouse doesn't introspect existing classes, we're forced to + # only pay attention to other Mouse classes + sub _metaclass_cache { + my $class = shift; + my $name = shift; + return $METACLASS_CACHE{$name}; + } + + sub initialize { + my $class = shift; + my $name = shift; + $METACLASS_CACHE{$name} = $class->new(name => $name) + if !exists($METACLASS_CACHE{$name}); + return $METACLASS_CACHE{$name}; + } +}; + +sub new { + my $class = shift; + my %args = @_; + + $args{attributes} ||= {}; + + bless \%args, $class; +} + +sub name { $_[0]->{name} } + +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; + + 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); + } +} + +for my $modifier_type (qw/before after around/) { + no strict 'refs'; + *{ __PACKAGE__ . '::' . "get_${modifier_type}_method_modifiers" } = sub { + my ($self, $method_name, $method) = @_; + @{ $self->{"${modifier_type}_method_modifiers"}->{$method_name} || [] } + }; +} 1;