Keep track of the instantiated metaclass in associated_class, use the MOP better...
[gitmo/Mouse.git] / lib / Mouse.pm
index 3db29a6..c6013e9 100644 (file)
@@ -3,7 +3,7 @@ package Mouse;
 use strict;
 use warnings;
 
-our $VERSION = '0.03';
+our $VERSION = '0.05';
 use 5.006;
 
 use Sub::Exporter;
@@ -33,13 +33,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, @_);
+                    }
                 }
             };
         },
@@ -63,6 +71,20 @@ do {
         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({
@@ -317,11 +339,20 @@ 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 | HashRef
+
+Triggers are like method modifiers for setting attribute values. You can have
+a "before" and an "after" trigger, each of which receive as arguments the instance, the new value, and the attribute metaclass. Historically, triggers have
+only been "after" modifiers, so if you use a coderef for the C<trigger> option,
+it will maintain that compatibility. Like method modifiers, you can't really
+affect the act of setting the attribute value, and the return values of the 
+modifiers are ignored.
 
-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.
+There's also an "around" trigger which you can use to change the value that
+is being set on the attribute, or even prevent the attribute from being
+updated. The around trigger receives as arguments a code reference to invoke
+to set the attribute's value (which expects as arguments the instance and
+the new value), the instance, the new value, and the attribute metaclass.
 
 =item builder => Str