X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse.pm;h=4731125524869b07aa88eea31c3dd8aaff376f62;hp=72d6ba3d6e27b54b7a92bd2899d3f7dec80e96e2;hb=abfdffe0146e788b3b808398fb075231163c3948;hpb=8aeec00e16ce77ccab0e5222106b2b83979edb5f diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 72d6ba3..4731125 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -4,7 +4,7 @@ use warnings; use 5.006; use base 'Exporter'; -our $VERSION = '0.15'; +our $VERSION = '0.18'; BEGIN { if ($ENV{MOUSE_DEBUG}) { @@ -21,9 +21,9 @@ use Mouse::Util; use Mouse::Meta::Attribute; use Mouse::Meta::Class; use Mouse::Object; -use Mouse::TypeRegistry; +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(@_) } @@ -32,13 +32,25 @@ sub has { my $names = shift; $names = [$names] if !ref($names); + my $metaclass = 'Mouse::Meta::Attribute'; + my %options = @_; + + if ( my $metaclass_name = delete $options{metaclass} ) { + my $new_class = Mouse::Util::resolve_metaclass_alias( + 'Attribute', + $metaclass_name + ); + if ( $metaclass ne $new_class ) { + $metaclass = $new_class; + } + } for my $name (@$names) { if ($name =~ s/^\+//) { - Mouse::Meta::Attribute->clone_parent($meta, $name, @_); + $metaclass->clone_parent($meta, $name, @_); } else { - Mouse::Meta::Attribute->create($meta, $name, @_); + $metaclass->create($meta, $name, @_); } } } @@ -77,6 +89,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; @@ -85,6 +127,12 @@ sub import { my $caller = caller; + # we should never export to main + if ($caller eq 'main') { + warn qq{$class does not export its sugar to the 'main' package.\n}; + return; + } + my $meta = Mouse::Meta::Class->initialize($caller); $meta->superclasses('Mouse::Object') unless $meta->superclasses; @@ -208,11 +256,9 @@ Mouse aims to alleviate this by providing a subset of Moose's functionality, faster. In particular, L is missing only a few expert-level features. -We're also going as light on dependencies as possible. Most functions we use -from L are copied into this dist. L is required if -you'd like weak references; there's simply no way to do it from pure Perl. -L is required if you want support for L, -L, and L. +We're also going as light on dependencies as possible. +L or L is required if you want support +for L, L, and L. =head2 MOOSE COMPAT @@ -225,35 +271,15 @@ The idea is that, if you need the extra power, you should be able to run C on your codebase and have nothing break. To that end, nothingmuch has written L (part of this distribution) which will act as Mouse unless Moose is loaded, in which case it will act as Moose. +L is a more high-tech L. -Mouse also has the blessings of Moose's author, stevan. - -=head2 MISSING FEATURES - -=head3 Roles - -We're working on fixing this one! stevan has suggested an implementation -strategy. Mouse currently ignores methods, so that needs to be fixed next. -Roles that consist entirely of attributes may be usable in this very version. - -=head3 Complex types - -User-defined type constraints and parameterized types may be implemented. Type -coercions probably not (patches welcome). - -=head3 Bootstrapped meta world - -Very handy for extensions to the MOP. Not pressing, but would be nice to have. - -=head3 Modification of attribute metaclass - -When you declare an attribute with L, you get the inlined accessors -installed immediately. Modifying the attribute metaclass, even if possible, -does nothing. +=head2 MouseX -=head3 Lots more.. +Please don't copy MooseX code to MouseX. If you need extensions, you really +should upgrade to Moose. We don't need two parallel sets of extensions! -MouseX? +If you really must write a Mouse extension, please contact the Moose mailing +list or #moose on IRC beforehand. =head1 KEYWORDS