-#!/usr/bin/env perl
+
package Mouse;
use strict;
use warnings;
+use 5.006;
use base 'Exporter';
-our $VERSION = '0.08';
+our $VERSION = '0.13';
use 5.006;
+BEGIN {
+ if ($ENV{MOUSE_DEBUG}) {
+ *DEBUG = sub (){ 1 };
+ } else {
+ *DEBUG = sub (){ 0 };
+ }
+}
+
use Carp 'confess';
-use Mouse::Util 'blessed';
+use Scalar::Util 'blessed';
+use Mouse::Util;
use Mouse::Meta::Attribute;
use Mouse::Meta::Class;
}
sub with {
- my $meta = Mouse::Meta::Class->initialize(caller);
-
- my $role = shift;
-
- confess "Mouse::Role only supports 'with' on individual roles at a time" if @_;
-
- Mouse::load_class($role);
- $role->meta->apply($meta);
+ Mouse::Util::apply_all_roles((caller)[0], @_);
}
sub import {
+ my $class = shift;
+
strict->import;
warnings->import;
no warnings 'redefine';
*{$caller.'::meta'} = sub { $meta };
- Mouse->export_to_level(1, @_);
+ if (@_) {
+ __PACKAGE__->export_to_level( 1, $class, @_);
+ } else {
+ # shortcut for the common case of no type character
+ no strict 'refs';
+ for my $keyword (@EXPORT) {
+ *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
+ }
+ }
}
sub unimport {
confess "Invalid class name ($display)";
}
+ return 1 if $class eq 'Mouse::Object';
return 1 if is_class_loaded($class);
(my $file = "$class.pm") =~ s{::}{/}g;
functionality, faster. In particular, L<Moose/has> is missing only a few
expert-level features.
+We're also going as light on dependencies as possible. Most functions we use
+from L<Scalar::Util> are copied into this dist. L<Scalar::Util> is required if
+you'd like weak references; there's simply no way to do it from pure Perl.
+L<Class::Method::Modifiers> is required if you want support for L</before>,
+L</after>, and L</around>.
+
=head2 MOOSE COMPAT
Compatibility with Moose has been the utmost concern. Fewer than 1% of the
Installs a "before" method modifier. See L<Moose/before> or
L<Class::Method::Modifiers/before>.
+Use of this feature requires L<Class::Method::Modifiers>!
+
=head2 after (method|methods) => Code
Installs an "after" method modifier. See L<Moose/after> or
L<Class::Method::Modifiers/after>.
+Use of this feature requires L<Class::Method::Modifiers>!
+
=head2 around (method|methods) => Code
Installs an "around" method modifier. See L<Moose/around> or
L<Class::Method::Modifiers/around>.
+Use of this feature requires L<Class::Method::Modifiers>!
+
=head2 has (name|names) => parameters
Adds an attribute (or if passed an arrayref of names, multiple attributes) to
has a builder, then providing a value for the attribute in the constructor is
optional.
-=item init_arg => Str
+=item init_arg => Str | Undef
-Allows you to use a different key name in the constructor.
+Allows you to use a different key name in the constructor. If undef, the
+attribue can't be passed to the constructor.
=item default => Value | CodeRef
Lets you automatically weaken any reference stored in the attribute.
+Use of this feature requires L<Scalar::Util>!
+
=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.
-Mouse 0.05 supported more complex triggers, but this behavior is now deprecated.
+Mouse 0.05 supported more complex triggers, but this behavior is now removed.
=item builder => Str
bucket status). You must specify an appropriate type constraint to use
auto_deref.
+=item lazy_build => 0|1
+
+Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
+"clear_$attr', predicate => 'has_$attr' unless they are already defined.
+
=back
=head2 confess error -> BOOM
Shawn M Moore, C<< <sartak at gmail.com> >>
+Yuval Kogman, C<< <nothingmuch at woobling.org> >>
+
with plenty of code borrowed from L<Class::MOP> and L<Moose>
=head1 BUGS