Remove blessed from Mouse::Object because it's not used
[gitmo/Mouse.git] / lib / Mouse.pm
index 35acad9..71640fc 100644 (file)
@@ -1,10 +1,10 @@
-#!perl
+#!/usr/bin/env perl
 package Mouse;
 use strict;
 use warnings;
 
-our $VERSION = '0.01';
-use 5.6.0;
+our $VERSION = '0.07';
+use 5.006;
 
 use Sub::Exporter;
 use Carp 'confess';
@@ -32,13 +32,21 @@ do {
         },
 
         has => sub {
+            my $caller = $CALLER;
+
             return sub {
-                my $package = caller;
+                my $meta = $caller->meta;
+
                 my $names = shift;
                 $names = [$names] if !ref($names);
 
                 for my $name (@$names) {
-                    Mouse::Meta::Attribute->create($package, $name, @_);
+                    if ($name =~ s/^\+//) {
+                        Mouse::Meta::Attribute->clone_parent($meta, $name, @_);
+                    }
+                    else {
+                        Mouse::Meta::Attribute->create($meta, $name, @_);
+                    }
                 }
             };
         },
@@ -50,6 +58,59 @@ do {
         blessed => sub {
             return \&blessed;
         },
+
+        before => sub {
+            my $caller = $CALLER;
+
+            return sub {
+                my $code = pop;
+                my $class = $caller->meta;
+
+                for (@_) {
+                    $class->add_before_method_modifier($_ => $code);
+                }
+            };
+        },
+
+        after => sub {
+            my $caller = $CALLER;
+
+            return sub {
+                my $code = pop;
+                my $class = $caller->meta;
+
+                for (@_) {
+                    $class->add_after_method_modifier($_ => $code);
+                }
+            };
+        },
+
+        around => sub {
+            my $caller = $CALLER;
+
+            return sub {
+                my $code = pop;
+                my $class = $caller->meta;
+
+                for (@_) {
+                    $class->add_around_method_modifier($_ => $code);
+                }
+            };
+        },
+
+        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({
@@ -137,10 +198,6 @@ __END__
 
 Mouse - Moose minus the antlers
 
-=head1 VERSION
-
-Version 0.01 released 10 Jun 08
-
 =head1 SYNOPSIS
 
     package Point;
@@ -162,11 +219,10 @@ Version 0.01 released 10 Jun 08
 
     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
 
@@ -184,23 +240,23 @@ 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 97%. 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 next, with a reimplementation of L<Class::Method::Modifiers>.
-
 =head3 Roles
 
-Fixing this one slightly less soon. stevan has suggested an implementation
-strategy. Mouse currently mostly ignores methods.
+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
 
@@ -231,6 +287,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
@@ -295,11 +366,11 @@ L</handles>, such as regular expression and coderef, are not yet supported.
 
 Lets you automatically weaken any reference stored in the attribute.
 
-=item trigger => Coderef
+=item trigger => CodeRef
+
+Any time the attribute's value is set (either through the accessor or the constructor), the trigger is called on it. The trigger receives as arguments the instance, the new value, and the attribute instance.
 
-Any time the attribute's value is set (either through the accessor or the
-constructor), the trigger is called on it. The trigger receives as arguments
-the instance, the new value, and the attribute instance.
+Mouse 0.05 supported more complex triggers, but this behavior is now deprecated.
 
 =item builder => Str