use strict;
use warnings;
-our $VERSION = '0.01';
+our $VERSION = '0.05';
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;
$names = [$names] if !ref($names);
for my $name (@$names) {
- Mouse::Meta::Attribute->create($package, $name, @_);
+ if ($name =~ s/^\+//) {
+ Mouse::Meta::Attribute->clone_parent($package, $name, @_);
+ }
+ else {
+ Mouse::Meta::Attribute->create($package, $name, @_);
+ }
}
};
},
blessed => sub {
return \&blessed;
},
+
+ before => sub {
+ return \&Class::Method::Modifiers::before;
+ },
+
+ after => sub {
+ return \&Class::Method::Modifiers::after;
+ },
+
+ 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({
Mouse - Moose minus the antlers
-=head1 VERSION
-
-Version 0.01 released 10 Jun 08
-
=head1 SYNOPSIS
package Point;
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
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 99%. 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
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
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