10 if ($ENV{MOUSE_DEBUG}) {
18 use Scalar::Util 'blessed';
21 use Mouse::Meta::Attribute;
22 use Mouse::Meta::Class;
24 use Mouse::Util::TypeConstraints;
26 our @EXPORT = qw(extends has before after around override super blessed confess with);
28 sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) }
31 my $meta = Mouse::Meta::Class->initialize(caller);
32 $meta->add_attribute(@_);
36 my $meta = Mouse::Meta::Class->initialize(caller);
41 $meta->add_before_method_modifier($_ => $code);
46 my $meta = Mouse::Meta::Class->initialize(caller);
51 $meta->add_after_method_modifier($_ => $code);
56 my $meta = Mouse::Meta::Class->initialize(caller);
61 $meta->add_around_method_modifier($_ => $code);
66 Mouse::Util::apply_all_roles((caller)[0], @_);
74 # This check avoids a recursion loop - see
75 # t/100_bugs/020_super_recursion.t
76 return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller();
77 return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS);
81 my $meta = Mouse::Meta::Class->initialize(caller);
82 my $pkg = $meta->name;
87 my $body = $pkg->can($name)
88 or confess "You cannot override '$name' because it has no super method";
90 $meta->add_method($name => sub {
91 local $SUPER_PACKAGE = $pkg;
92 local @SUPER_ARGS = @_;
93 local $SUPER_BODY = $body;
106 if (ref($_[0]) && ref($_[0]) eq 'HASH') {
112 my $level = delete $opts->{into_level};
113 $level = 0 unless defined $level;
114 my $caller = caller($level);
116 # we should never export to main
117 if ($caller eq 'main') {
118 warn qq{$class does not export its sugar to the 'main' package.\n};
122 my $meta = Mouse::Meta::Class->initialize($caller);
123 $meta->superclasses('Mouse::Object')
124 unless $meta->superclasses;
127 no warnings 'redefine';
128 *{$caller.'::meta'} = sub { $meta };
131 __PACKAGE__->export_to_level( $level+1, $class, @_);
133 # shortcut for the common case of no type character
135 for my $keyword (@EXPORT) {
136 *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
145 for my $keyword (@EXPORT) {
146 delete ${ $caller . '::' }{$keyword};
153 if (ref($class) || !defined($class) || !length($class)) {
154 my $display = defined($class) ? $class : 'undef';
155 confess "Invalid class name ($display)";
158 return 1 if $class eq 'Mouse::Object';
159 return 1 if is_class_loaded($class);
161 (my $file = "$class.pm") =~ s{::}{/}g;
163 eval { CORE::require($file) };
164 confess "Could not load class ($class) because : $@" if $@;
169 sub is_class_loaded {
172 return 0 if ref($class) || !defined($class) || !length($class);
174 # walk the symbol table tree to avoid autovififying
175 # \*{${main::}{"Foo::"}} == \*main::Foo::
178 foreach my $part (split('::', $class)) {
179 return 0 unless exists ${$$pack}{"${part}::"};
180 $pack = \*{${$$pack}{"${part}::"}};
183 # check for $VERSION or @ISA
184 return 1 if exists ${$$pack}{VERSION}
185 && defined *{${$$pack}{VERSION}}{SCALAR};
186 return 1 if exists ${$$pack}{ISA}
187 && defined *{${$$pack}{ISA}}{ARRAY};
189 # check for any method
190 foreach ( keys %{$$pack} ) {
191 next if substr($_, -2, 2) eq '::';
192 return 1 if defined *{${$$pack}{$_}}{CODE};
205 Mouse - Moose minus the antlers
210 use Mouse; # automatically turns on strict and warnings
212 has 'x' => (is => 'rw', isa => 'Int');
213 has 'y' => (is => 'rw', isa => 'Int');
226 has 'z' => (is => 'rw', isa => 'Int');
228 after 'clear' => sub {
235 L<Moose> is wonderful.
237 Unfortunately, it's a little slow. Though significant progress has been made
238 over the years, the compile time penalty is a non-starter for some
241 Mouse aims to alleviate this by providing a subset of Moose's
242 functionality, faster. In particular, L<Moose/has> is missing only a few
243 expert-level features.
245 We're also going as light on dependencies as possible.
246 L<Class::Method::Modifiers> or L<Data::Util> is required if you want support
247 for L</before>, L</after>, and L</around>.
251 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
252 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
253 over 96%. Even the error messages are taken from Moose. The Mouse code just
254 runs the test suite 4x faster.
256 The idea is that, if you need the extra power, you should be able to run
257 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
258 nothingmuch has written L<Squirrel> (part of this distribution) which will act
259 as Mouse unless Moose is loaded, in which case it will act as Moose.
260 L<Any::Moose> is a more high-tech L<Squirrel>.
264 Please don't copy MooseX code to MouseX. If you need extensions, you really
265 should upgrade to Moose. We don't need two parallel sets of extensions!
267 If you really must write a Mouse extension, please contact the Moose mailing
268 list or #moose on IRC beforehand.
272 =head2 meta -> Mouse::Meta::Class
274 Returns this class' metaclass instance.
276 =head2 extends superclasses
278 Sets this class' superclasses.
280 =head2 before (method|methods) => Code
282 Installs a "before" method modifier. See L<Moose/before> or
283 L<Class::Method::Modifiers/before>.
285 Use of this feature requires L<Class::Method::Modifiers>!
287 =head2 after (method|methods) => Code
289 Installs an "after" method modifier. See L<Moose/after> or
290 L<Class::Method::Modifiers/after>.
292 Use of this feature requires L<Class::Method::Modifiers>!
294 =head2 around (method|methods) => Code
296 Installs an "around" method modifier. See L<Moose/around> or
297 L<Class::Method::Modifiers/around>.
299 Use of this feature requires L<Class::Method::Modifiers>!
301 =head2 has (name|names) => parameters
303 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
310 If specified, inlines a read-only/read-write accessor with the same name as
313 =item isa => TypeConstraint
315 Provides basic type checking in the constructor and accessor. Basic types such
316 as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
317 be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
320 =item required => 0|1
322 Whether this attribute is required to have a value. If the attribute is lazy or
323 has a builder, then providing a value for the attribute in the constructor is
326 =item init_arg => Str | Undef
328 Allows you to use a different key name in the constructor. If undef, the
329 attribue can't be passed to the constructor.
331 =item default => Value | CodeRef
333 Sets the default value of the attribute. If the default is a coderef, it will
334 be invoked to get the default value. Due to quirks of Perl, any bare reference
335 is forbidden, you must wrap the reference in a coderef. Otherwise, all
336 instances will share the same reference.
340 If specified, the default is calculated on demand instead of in the
343 =item predicate => Str
345 Lets you specify a method name for installing a predicate method, which checks
346 that the attribute has a value. It will not invoke a lazy default or builder
351 Lets you specify a method name for installing a clearer method, which clears
352 the attribute's value from the instance. On the next read, lazy or builder will
355 =item handles => HashRef|ArrayRef
357 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
358 given method names to method calls on the attribute. HashRef maps local method
359 names to remote method names called on the attribute. Other forms of
360 L</handles>, such as regular expression and coderef, are not yet supported.
362 =item weak_ref => 0|1
364 Lets you automatically weaken any reference stored in the attribute.
366 Use of this feature requires L<Scalar::Util>!
368 =item trigger => CodeRef
370 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.
372 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
376 Defines a method name to be called to provide the default value of the
377 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
378 C<< default => sub { $_[0]->build_foo } >>.
380 =item auto_deref => 0|1
382 Allows you to automatically dereference ArrayRef and HashRef attributes in list
383 context. In scalar context, the reference is returned (NOT the list length or
384 bucket status). You must specify an appropriate type constraint to use
387 =item lazy_build => 0|1
389 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
390 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
394 =head2 confess error -> BOOM
396 L<Carp/confess> for your convenience.
398 =head2 blessed value -> ClassName | undef
400 L<Scalar::Util/blessed> for your convenience.
406 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
407 You may use L</extends> to replace the superclass list.
411 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
412 keywords (such as L</extends>) it will break loudly instead breaking subtly.
416 =head2 load_class Class::Name
418 This will load a given C<Class::Name> (or die if it's not loadable).
419 This function can be used in place of tricks like
420 C<eval "use $module"> or using C<require>.
422 =head2 is_class_loaded Class::Name -> Bool
424 Returns whether this class is actually loaded or not. It uses a heuristic which
425 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
426 locally-defined method.
430 Shawn M Moore, C<< <sartak at gmail.com> >>
432 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
438 with plenty of code borrowed from L<Class::MOP> and L<Moose>
444 Please report any bugs through RT: email
445 C<bug-mouse at rt.cpan.org>, or browse
446 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
448 =head1 COPYRIGHT AND LICENSE
450 Copyright 2008 Shawn M Moore.
452 This program is free software; you can redistribute it and/or modify it
453 under the same terms as Perl itself.