X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse.pm;h=c55e05350a35e79994fc0f17b308acf9154fe71b;hp=0d5e4432de94a88e39f3f6122c540f7c6b0ec722;hb=e6007308abd5bc18fc86ed19d68732488750493f;hpb=d44f0d03f175f6812650ec7c86cb3b3878667cae diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 0d5e443..c55e053 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -23,7 +23,7 @@ use Mouse::Meta::Class; use Mouse::Object; use Mouse::Util::TypeConstraints; -our @EXPORT = qw(extends has before after around blessed confess with); +our @EXPORT = qw(extends has before after around override super blessed confess with); sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) } @@ -77,6 +77,36 @@ sub with { Mouse::Util::apply_all_roles((caller)[0], @_); } +our $SUPER_PACKAGE; +our $SUPER_BODY; +our @SUPER_ARGS; + +sub super { + # This check avoids a recursion loop - see + # t/100_bugs/020_super_recursion.t + return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller(); + return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS); +} + +sub override { + my $meta = Mouse::Meta::Class->initialize(caller); + my $pkg = $meta->name; + + my $name = shift; + my $code = shift; + + my $body = $pkg->can($name) + or confess "You cannot override '$name' because it has no super method"; + + $meta->add_method($name => sub { + local $SUPER_PACKAGE = $pkg; + local @SUPER_ARGS = @_; + local $SUPER_BODY = $body; + + $code->(@_); + }); +} + sub import { my $class = shift;