From: Shawn M Moore Date: Wed, 11 Jun 2008 11:03:51 +0000 (+0000) Subject: Add compute_all_applicable_attributes X-Git-Tag: 0.04~20 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=72b88a88c7fcec20e784aa82fc6d257e32b02a75;p=gitmo%2FMouse.git Add compute_all_applicable_attributes --- diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index ea7c896..74082e4 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -3,10 +3,21 @@ package Mouse::Meta::Class; use strict; use warnings; +use Scalar::Util 'blessed'; + use MRO::Compat; 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; @@ -49,6 +60,23 @@ sub add_attribute { $self->{'attributes'}{$attr->name} = $attr; } +sub compute_all_applicable_attributes { + my $self = shift; + my (@attr, %seen); + + for my $class ($self->linearized_isa) { + my $meta = $self->_metaclass_cache($class) + or next; + + for my $name (keys %{ $meta->get_attribute_map }) { + next if $seen{$name}++; + push @attr, $meta->get_attribute($name); + } + } + + return @attr; +} + sub get_attribute_map { $_[0]->{attributes} } sub get_attribute { $_[0]->{attributes}->{$_[1]} } @@ -86,6 +114,11 @@ Gets (or sets) the list of superclasses of the owner class. Begins keeping track of the existing L for the owner class. +=head2 compute_all_applicable_attributes -> (Mouse::Meta::Attribute) + +Returns the list of all L instances associated with +this class and its superclasses. + =head2 get_attribute_map -> { name => Mouse::Meta::Attribute } Returns a mapping of attribute names to their corresponding