X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse.pm;h=c6013e99933fe87b1312ad9164370b1b82091ec3;hb=c5cbafa4db9e41ee4f489943581b46915ecb7145;hp=cb525f02df6456bb601d9fc9710be0868adca11b;hpb=3ab0ee8f8aaf8eecb7843ddeab1d464c90b2872d;p=gitmo%2FMouse.git diff --git a/lib/Mouse.pm b/lib/Mouse.pm index cb525f0..c6013e9 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -33,17 +33,20 @@ 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) { if ($name =~ s/^\+//) { - Mouse::Meta::Attribute->clone_parent($package, $name, @_); + Mouse::Meta::Attribute->clone_parent($meta, $name, @_); } else { - Mouse::Meta::Attribute->create($package, $name, @_); + Mouse::Meta::Attribute->create($meta, $name, @_); } } }; @@ -76,8 +79,10 @@ do { 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->apply_to_class($class); + $role->meta->apply($class); }; }, ); @@ -334,11 +339,20 @@ L, 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 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