Ensure that "has '+nonexistent'" fails
[gitmo/Mouse.git] / lib / Mouse.pm
index cab4a9f..1f1e386 100644 (file)
@@ -3,11 +3,13 @@ package Mouse;
 use strict;
 use warnings;
 
-our $VERSION = '0.01';
+our $VERSION = '0.05';
+use 5.006;
 
 use Sub::Exporter;
 use Carp 'confess';
 use Scalar::Util 'blessed';
+use Class::Method::Modifiers ();
 
 use Mouse::Meta::Attribute;
 use Mouse::Meta::Class;
@@ -37,7 +39,12 @@ do {
                 $names = [$names] if !ref($names);
 
                 for my $name (@$names) {
-                    Mouse::Meta::Attribute->create($package, $name, @_);
+                    if ($name =~ s/^\+//) {
+                        Mouse::Meta::Attribute->clone_parent($package, $name, @_);
+                    }
+                    else {
+                        Mouse::Meta::Attribute->create($package, $name, @_);
+                    }
                 }
             };
         },
@@ -49,6 +56,32 @@ do {
         blessed => sub {
             return \&blessed;
         },
+
+        before => sub {
+            return \&Class::Method::Modifiers::before;
+        },
+
+        after => sub {
+            return \&Class::Method::Modifiers::after;
+        },
+
+        around => sub {
+            return \&Class::Method::Modifiers::around;
+        },
+
+        with => sub {
+            my $caller = $CALLER;
+
+            return sub {
+                my $role  = shift;
+                my $class = $caller->meta;
+
+                confess "Mouse::Role only supports 'with' on individual roles at a time" if @_;
+
+                Mouse::load_class($role);
+                $role->meta->apply($class);
+            };
+        },
     );
 
     my $exporter = Sub::Exporter::build_exporter({
@@ -136,10 +169,6 @@ __END__
 
 Mouse - Moose minus the antlers
 
-=head1 VERSION
-
-Version 0.01 released ???
-
 =head1 SYNOPSIS
 
     package Point;
@@ -161,11 +190,10 @@ Version 0.01 released ???
 
     has 'z' => (is => 'rw', isa => 'Int');
 
-    # not implemented yet :)
-    #after 'clear' => sub {
-    #    my $self = shift;
-    #    $self->z(0);
-    #};
+    after 'clear' => sub {
+        my $self = shift;
+        $self->z(0);
+    };
 
 =head1 DESCRIPTION
 
@@ -183,19 +211,18 @@ expert-level features.
 
 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
-over 99%. Even the error messages are taken from Moose.
+over 99%. Even the error messages are taken from Moose. The Mouse code just
+runs the test suite 3x-4x faster.
 
 The idea is that, if you need the extra power, you should be able to run
-C<s/Mouse/Moose/g> on your codebase and have nothing break.
+C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
+nothingmuch has written L<Squirrel> (part of this distribution) which will act
+as Mouse unless Moose is loaded, in which case it will act as Moose.
 
 Mouse also has the blessings of Moose's author, stevan.
 
 =head2 MISSING FEATURES
 
-=head3 Method modifiers
-
-Fixing this one soon, with a reimplementation of L<Class::Method::Modifiers>.
-
 =head3 Roles
 
 Fixing this one slightly less soon. stevan has suggested an implementation
@@ -230,6 +257,21 @@ Returns this class' metaclass instance.
 
 Sets this class' superclasses.
 
+=head2 before (method|methods) => Code
+
+Installs a "before" method modifier. See L<Moose/before> or
+L<Class::Method::Modifiers/before>.
+
+=head2 after (method|methods) => Code
+
+Installs an "after" method modifier. See L<Moose/after> or
+L<Class::Method::Modifiers/after>.
+
+=head2 around (method|methods) => Code
+
+Installs an "around" method modifier. See L<Moose/around> or
+L<Class::Method::Modifiers/around>.
+
 =head2 has (name|names) => parameters
 
 Adds an attribute (or if passed an arrayref of names, multiple attributes) to