X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FClass.pm;h=0eb22ecb2dfa8d7ea38a950ca2dc63ad27c565fd;hp=8e89567673f0389743dbd1164f7b65cfe8bc3f9a;hb=6719984210754e8d012ae678536f194c35000823;hpb=56a558f97f2da37b37db51a6a8ef7f923e84724e diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 8e89567..0eb22ec 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -5,7 +5,7 @@ use warnings; use Mouse::Meta::Method::Constructor; use Mouse::Meta::Method::Destructor; use Scalar::Util qw/blessed/; -use Mouse::Util qw/get_linear_isa/; +use Mouse::Util qw/get_linear_isa version authority identifier/; use Carp 'confess'; do { @@ -20,8 +20,9 @@ do { } sub initialize { - my $class = shift; - my $name = shift; + my $class = blessed($_[0]) || $_[0]; + my $name = $_[1]; + $METACLASS_CACHE{$name} = $class->new(name => $name) if !exists($METACLASS_CACHE{$name}); return $METACLASS_CACHE{$name}; @@ -76,7 +77,7 @@ my $get_methods_for_class = sub { no strict 'refs'; # Get all the CODE symbol table entries my @functions = - grep !/^(?:has|with|around|before|after|blessed|extends|confess|override|super)$/, + grep !/^(?:has|with|around|before|after|augment|inner|blessed|extends|confess|override|super)$/, grep { defined &{"${name}::$_"} } keys %{"${name}::"}; push @functions, keys %{$self->{'methods'}->{$name}} if $self; @@ -260,6 +261,22 @@ sub add_after_method_modifier { $self->_install_modifier( $self->name, 'after', $name, $code ); } +sub add_override_method_modifier { + my ($self, $name, $code) = @_; + + my $pkg = $self->name; + my $method = "${pkg}::${name}"; + + # Class::Method::Modifiers won't do this for us, so do it ourselves + + my $body = $pkg->can($name) + or confess "You cannot override '$method' because it has no super method"; + + no strict 'refs'; + *$method = sub { $code->($pkg, $body, @_) }; +} + + sub roles { $_[0]->{roles} } sub does_role {