From: gfx Date: Wed, 18 Nov 2009 02:37:27 +0000 (+0900) Subject: Add metaclass compatibility stuff X-Git-Tag: 0.40_08~18 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=commitdiff_plain;h=b6369395ff3663e73319351d01fe8a31f2b3dbf2;hp=8aba926dbf11e9cf418c7c79b925d15e60e1e990 Add metaclass compatibility stuff --- diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index e8593f6..8871128 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -54,9 +54,18 @@ sub superclasses { foreach my $super(@_){ Mouse::Util::load_class($super); my $meta = Mouse::Util::get_metaclass_by_name($super); + + next if not defined $meta; + if(Mouse::Util::is_a_metarole($meta)){ $self->throw_error("You cannot inherit from a Mouse Role ($super)"); } + + next if $self->isa(ref $meta); # _superclass_meta_is_compatible + + # XXX: should we check 'is_pristine' ? + + $self->_reconcile_with_superclass_meta($meta); } @{ $self->{superclasses} } = @_; } @@ -64,6 +73,33 @@ sub superclasses { return @{ $self->{superclasses} }; } +my @MetaClassTypes = qw( + attribute_metaclass + method_metaclass + constructor_class + destructor_class +); + +sub _reconcile_with_superclass_meta { + my($self, $super_meta) = @_; + + my @incompatibles; + foreach my $metaclass_type(@MetaClassTypes){ + my $super_c = $super_meta->$metaclass_type(); + my $self_c = $self->$metaclass_type(); + + if(!$super_c->isa($self_c)){ + push @incompatibles, $metaclass_type => $super_c; + } + } + + if(@incompatibles){ + $super_meta->reinitialize($self->name, @incompatibles); + } + return; +} + + sub find_method_by_name{ my($self, $method_name) = @_; defined($method_name)