Remove blessed from Mouse::Object because it's not used
[gitmo/Mouse.git] / lib / Mouse.pm
index 2e71b9f..71640fc 100644 (file)
@@ -1,15 +1,14 @@
-#!perl
+#!/usr/bin/env perl
 package Mouse;
 use strict;
 use warnings;
 
-our $VERSION = '0.04';
+our $VERSION = '0.07';
 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;
@@ -33,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, @_);
+                    }
                 }
             };
         },
@@ -53,15 +60,56 @@ do {
         },
 
         before => sub {
-            return \&Class::Method::Modifiers::before;
+            my $caller = $CALLER;
+
+            return sub {
+                my $code = pop;
+                my $class = $caller->meta;
+
+                for (@_) {
+                    $class->add_before_method_modifier($_ => $code);
+                }
+            };
         },
 
         after => sub {
-            return \&Class::Method::Modifiers::after;
+            my $caller = $CALLER;
+
+            return sub {
+                my $code = pop;
+                my $class = $caller->meta;
+
+                for (@_) {
+                    $class->add_after_method_modifier($_ => $code);
+                }
+            };
         },
 
         around => sub {
-            return \&Class::Method::Modifiers::around;
+            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);
+            };
         },
     );
 
@@ -192,7 +240,7 @@ 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. The Mouse code just
+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
@@ -206,8 +254,9 @@ Mouse also has the blessings of Moose's author, stevan.
 
 =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
 
@@ -317,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