X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse.pm;h=2ab93113dc8d761a7d9b75c5928285bbac6c1aa0;hb=faa5cb70c15f3240389feb65d23297e491efeee6;hp=329ed83be6bd34422572495fee4b84779e981afc;hpb=8517d2ffa37a1201d9bf388d60b23a5daea27272;p=gitmo%2FMouse.git diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 329ed83..2ab9311 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -1,9 +1,9 @@ -#!perl +#!/usr/bin/env perl package Mouse; use strict; use warnings; -our $VERSION = '0.02'; +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({ @@ -150,10 +172,6 @@ __END__ Mouse - Moose minus the antlers -=head1 VERSION - -Version 0.02 released 11 Jun 08 - =head1 SYNOPSIS package Point; @@ -196,7 +214,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 @@ -208,14 +226,11 @@ 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. - =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 @@ -246,6 +261,21 @@ Returns this class' metaclass instance. Sets this class' superclasses. +=head2 before (method|methods) => Code + +Installs a "before" method modifier. See L or +L. + +=head2 after (method|methods) => Code + +Installs an "after" method modifier. See L or +L. + +=head2 around (method|methods) => Code + +Installs an "around" method modifier. See L or +L. + =head2 has (name|names) => parameters Adds an attribute (or if passed an arrayref of names, multiple attributes) to @@ -310,11 +340,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