Make Mouse::Util::load_class return the argument class name, which can remove several...
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1package Mouse;
eb88905f 2use 5.006_002;
3
bc69ee88 4use Mouse::Exporter; # enables strict and warnings
eb88905f 5
4bc73e47 6our $VERSION = '0.50_03';
c3398f5b 7
8bdd9cfc 8use Carp qw(confess);
43523060 9use Scalar::Util qw(blessed);
6d28c5cf 10
01afd8ff 11use Mouse::Util qw(load_class is_class_loaded get_code_package not_supported);
c3398f5b 12
08f7a8db 13use Mouse::Meta::Module;
306290e8 14use Mouse::Meta::Class;
43165725 15use Mouse::Meta::Role;
6d28c5cf 16use Mouse::Meta::Attribute;
c3398f5b 17use Mouse::Object;
6d28c5cf 18use Mouse::Util::TypeConstraints ();
fea36fd2 19
20Mouse::Exporter->setup_import_methods(
21 as_is => [qw(
22 extends with
23 has
24 before after around
25 override super
26 augment inner
27 ),
28 \&Scalar::Util::blessed,
29 \&Carp::confess,
30 ],
2cb8b713 31);
eaad7dab 32
43523060 33
9ee0e57c 34sub extends {
35 Mouse::Meta::Class->initialize(scalar caller)->superclasses(@_);
36 return;
37}
38
39sub with {
40 Mouse::Util::apply_all_roles(scalar(caller), @_);
41 return;
42}
c3398f5b 43
eaad7dab 44sub has {
8bc2760b 45 my $meta = Mouse::Meta::Class->initialize(scalar caller);
1b9e472d 46 my $name = shift;
47
9ee0e57c 48 $meta->throw_error(q{Usage: has 'name' => ( key => value, ... )})
95ecd6f1 49 if @_ % 2; # odd number of arguments
50
9ee0e57c 51 if(ref $name){ # has [qw(foo bar)] => (...)
52 for (@{$name}){
53 $meta->add_attribute($_ => @_);
54 }
55 }
56 else{ # has foo => (...)
34c8209c 57 $meta->add_attribute($name => @_);
9ee0e57c 58 }
59 return;
eaad7dab 60}
61
62sub before {
8bc2760b 63 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 64 my $code = pop;
013ee5f0 65 for my $name($meta->_collect_methods(@_)) {
66 $meta->add_before_method_modifier($name => $code);
eaad7dab 67 }
9ee0e57c 68 return;
eaad7dab 69}
70
71sub after {
8bc2760b 72 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 73 my $code = pop;
013ee5f0 74 for my $name($meta->_collect_methods(@_)) {
75 $meta->add_after_method_modifier($name => $code);
eaad7dab 76 }
9ee0e57c 77 return;
eaad7dab 78}
79
80sub around {
8bc2760b 81 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 82 my $code = pop;
013ee5f0 83 for my $name($meta->_collect_methods(@_)) {
84 $meta->add_around_method_modifier($name => $code);
eaad7dab 85 }
9ee0e57c 86 return;
eaad7dab 87}
88
e6007308 89our $SUPER_PACKAGE;
90our $SUPER_BODY;
91our @SUPER_ARGS;
92
93sub super {
94 # This check avoids a recursion loop - see
95 # t/100_bugs/020_super_recursion.t
85bd3f44 96 return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller();
97 return if !defined $SUPER_BODY;
98 $SUPER_BODY->(@SUPER_ARGS);
e6007308 99}
100
101sub override {
85bd3f44 102 # my($name, $method) = @_;
103 Mouse::Meta::Class->initialize(scalar caller)->add_override_method_modifier(@_);
e6007308 104}
105
768804c0 106our %INNER_BODY;
107our %INNER_ARGS;
108
109sub inner {
110 my $pkg = caller();
111 if ( my $body = $INNER_BODY{$pkg} ) {
112 my $args = $INNER_ARGS{$pkg};
113 local $INNER_ARGS{$pkg};
114 local $INNER_BODY{$pkg};
115 return $body->(@{$args});
116 }
117 else {
118 return;
119 }
120}
121
122sub augment {
123 #my($name, $method) = @_;
124 Mouse::Meta::Class->initialize(scalar caller)->add_augment_method_modifier(@_);
9ee0e57c 125 return;
768804c0 126}
2cb8b713 127
0d6e12be 128sub init_meta {
0d6e12be 129 shift;
130 my %args = @_;
131
132 my $class = $args{for_class}
382b7340 133 or confess("Cannot call init_meta without specifying a for_class");
c9a3c0ed 134
0d6e12be 135 my $base_class = $args{base_class} || 'Mouse::Object';
136 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
137
0d6e12be 138 my $meta = $metaclass->initialize($class);
0d6e12be 139
3a63a2e7 140 $meta->add_method(meta => sub{
382b7340 141 return $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 142 });
143
382b7340 144 $meta->superclasses($base_class)
7efbc77d 145 unless $meta->superclasses;
0d6e12be 146
c9a3c0ed 147 # make a class type for each Mouse class
148 Mouse::Util::TypeConstraints::class_type($class)
149 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
150
0d6e12be 151 return $meta;
152}
153
c3398f5b 1541;
c3398f5b 155__END__
156
157=head1 NAME
158
0fff36e6 159Mouse - Moose minus the antlers
c3398f5b 160
2efecf0c 161=head1 VERSION
162
4bc73e47 163This document describes Mouse version 0.50_03
2efecf0c 164
c3398f5b 165=head1 SYNOPSIS
166
167 package Point;
6caea456 168 use Mouse; # automatically turns on strict and warnings
169
170 has 'x' => (is => 'rw', isa => 'Int');
171 has 'y' => (is => 'rw', isa => 'Int');
172
173 sub clear {
174 my $self = shift;
175 $self->x(0);
176 $self->y(0);
177 }
178
7fa0bc1b 179
180 __PACKAGE__->meta->make_immutable();
181
6caea456 182 package Point3D;
c3398f5b 183 use Mouse;
184
6caea456 185 extends 'Point';
c3398f5b 186
6caea456 187 has 'z' => (is => 'rw', isa => 'Int');
188
8517d2ff 189 after 'clear' => sub {
190 my $self = shift;
191 $self->z(0);
192 };
c3398f5b 193
7fa0bc1b 194 __PACKAGE__->meta->make_immutable();
195
c3398f5b 196=head1 DESCRIPTION
197
6614c108 198L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 199
16913e71 200Unfortunately, Moose has a compile-time penalty. Though significant progress
201has been made over the years, the compile time penalty is a non-starter for
202some very specific applications. If you are writing a command-line application
203or CGI script where startup time is essential, you may not be able to use
204Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
205latter, if possible.
0fff36e6 206
6614c108 207Mouse aims to alleviate this by providing a subset of Moose's functionality,
208faster.
0fff36e6 209
4f74e488 210We're also going as light on dependencies as possible. Mouse currently has
211B<no dependencies> except for testing modules.
d1c1b994 212
1820fffe 213=head2 MOOSE COMPATIBILITY
0fff36e6 214
4aaed9e5 215Compatibility with Moose has been the utmost concern. The sugary interface is
216highly compatible with Moose. Even the error messages are taken from Moose.
217The Mouse code just runs the test suite 4x faster.
0fff36e6 218
219The idea is that, if you need the extra power, you should be able to run
8e1a28a8 220C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
6614c108 221we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
16913e71 222in which case it will act as Moose. Since Mouse is a little sloppier than
223Moose, if you run into weird errors, it would be worth running:
224
225 ANY_MOOSE=Moose perl your-script.pl
226
227to see if the bug is caused by Mouse. Moose's diagnostics and validation are
4aaed9e5 228also better.
0fff36e6 229
4f74e488 230See also L<Mouse::Spec> for compatibility and incompatibility with Moose.
231
9090e5fe 232=head2 MouseX
233
234Please don't copy MooseX code to MouseX. If you need extensions, you really
235should upgrade to Moose. We don't need two parallel sets of extensions!
236
237If you really must write a Mouse extension, please contact the Moose mailing
238list or #moose on IRC beforehand.
239
0fff36e6 240=head1 KEYWORDS
c3398f5b 241
1820fffe 242=head2 C<< $object->meta -> Mouse::Meta::Class >>
c3398f5b 243
244Returns this class' metaclass instance.
245
1820fffe 246=head2 C<< extends superclasses >>
c3398f5b 247
248Sets this class' superclasses.
249
b0b9f25a 250=head2 C<< before (method|methods|regexp) => CodeRef >>
b7a74822 251
8b13ad67 252Installs a "before" method modifier. See L<Moose/before>.
6beb7db6 253
b0b9f25a 254=head2 C<< after (method|methods|regexp) => CodeRef >>
b7a74822 255
8b13ad67 256Installs an "after" method modifier. See L<Moose/after>.
ed940a7a 257
b0b9f25a 258=head2 C<< around (method|methods|regexp) => CodeRef >>
b7a74822 259
8b13ad67 260Installs an "around" method modifier. See L<Moose/around>.
ed940a7a 261
1820fffe 262=head2 C<< has (name|names) => parameters >>
c3398f5b 263
264Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 265this class. Options:
266
267=over 4
268
1820fffe 269=item C<< is => ro|rw|bare >>
0fff36e6 270
b940eb46 271The I<is> option accepts either I<rw> (for read/write), I<ro> (for read
272only) or I<bare> (for nothing). These will create either a read/write accessor
273or a read-only accessor respectively, using the same name as the C<$name> of
0fff36e6 274the attribute.
275
b940eb46 276If you need more control over how your accessors are named, you can
277use the C<reader>, C<writer> and C<accessor> options, however if you
278use those, you won't need the I<is> option.
279
280=item C<< isa => TypeName | ClassName >>
0fff36e6 281
5893ee36 282Provides type checking in the constructor and accessor. The following types are
1820fffe 283supported. Any unknown type is taken to be a class check
284(e.g. C<< isa => 'DateTime' >> would accept only L<DateTime> objects).
5893ee36 285
286 Any Item Bool Undef Defined Value Num Int Str ClassName
287 Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
288 FileHandle Object
289
290For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
291
b940eb46 292=item C<< does => RoleName >>
293
294This will accept the name of a role which the value stored in this attribute
295is expected to have consumed.
296
297=item C<< coerce => Bool >>
298
299This will attempt to use coercion with the supplied type constraint to change
300the value passed into any accessors or constructors. You B<must> have supplied
301a type constraint in order for this to work. See L<Moose::Cookbook::Basics::Recipe5>
302for an example.
0fff36e6 303
1820fffe 304=item C<< required => Bool >>
0fff36e6 305
306Whether this attribute is required to have a value. If the attribute is lazy or
307has a builder, then providing a value for the attribute in the constructor is
308optional.
309
1820fffe 310=item C<< init_arg => Str | Undef >>
0fff36e6 311
ca63d17a 312Allows you to use a different key name in the constructor. If undef, the
1820fffe 313attribute can't be passed to the constructor.
0fff36e6 314
1820fffe 315=item C<< default => Value | CodeRef >>
0fff36e6 316
317Sets the default value of the attribute. If the default is a coderef, it will
318be invoked to get the default value. Due to quirks of Perl, any bare reference
319is forbidden, you must wrap the reference in a coderef. Otherwise, all
320instances will share the same reference.
321
1820fffe 322=item C<< lazy => Bool >>
0fff36e6 323
324If specified, the default is calculated on demand instead of in the
325constructor.
326
1820fffe 327=item C<< predicate => Str >>
0fff36e6 328
329Lets you specify a method name for installing a predicate method, which checks
330that the attribute has a value. It will not invoke a lazy default or builder
331method.
332
1820fffe 333=item C<< clearer => Str >>
0fff36e6 334
335Lets you specify a method name for installing a clearer method, which clears
336the attribute's value from the instance. On the next read, lazy or builder will
337be invoked.
338
b940eb46 339=item C<< handles => HashRef|ArrayRef|Regexp >>
0fff36e6 340
341Lets you specify methods to delegate to the attribute. ArrayRef forwards the
342given method names to method calls on the attribute. HashRef maps local method
343names to remote method names called on the attribute. Other forms of
b940eb46 344L</handles>, such as RoleName and CodeRef, are not yet supported.
0fff36e6 345
1820fffe 346=item C<< weak_ref => Bool >>
0fff36e6 347
348Lets you automatically weaken any reference stored in the attribute.
349
6beb7db6 350Use of this feature requires L<Scalar::Util>!
351
1820fffe 352=item C<< trigger => CodeRef >>
844fa049 353
354Any 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.
355
1820fffe 356=item C<< builder => Str >>
0fff36e6 357
358Defines a method name to be called to provide the default value of the
359attribute. C<< builder => 'build_foo' >> is mostly equivalent to
360C<< default => sub { $_[0]->build_foo } >>.
361
1820fffe 362=item C<< auto_deref => Bool >>
0fff36e6 363
364Allows you to automatically dereference ArrayRef and HashRef attributes in list
365context. In scalar context, the reference is returned (NOT the list length or
366bucket status). You must specify an appropriate type constraint to use
367auto_deref.
368
1820fffe 369=item C<< lazy_build => Bool >>
370
371Automatically define the following options:
5253d13d 372
1820fffe 373 has $attr => (
374 # ...
375 lazy => 1
376 builder => "_build_$attr",
377 clearer => "clear_$attr",
378 predicate => "has_$attr",
379 );
5253d13d 380
0fff36e6 381=back
c3398f5b 382
1820fffe 383=head2 C<< confess(message) -> BOOM >>
c3398f5b 384
385L<Carp/confess> for your convenience.
386
1820fffe 387=head2 C<< blessed(value) -> ClassName | undef >>
c3398f5b 388
389L<Scalar::Util/blessed> for your convenience.
390
391=head1 MISC
392
393=head2 import
394
6caea456 395Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 396You may use L</extends> to replace the superclass list.
397
398=head2 unimport
399
0fff36e6 400Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
401keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 402
13756394 403=head1 CAVEATS
404
5f692270 405If you use Mouse::XS you might see a fatal error on callbacks
1a8951d1 406which include C<eval 'BEGIN{ die }'>, which typically occurs in such code
407as C<eval 'use NotInstalledModule'>. This is not
13756394 408a bug in Mouse. In fact, it is a bug in Perl (RT #69939).
409
410To work around this problem, surround C<eval STRING> with C<eval BLOCK>:
411
412 sub callback {
5f692270 413 # eval 'use NotInstalledModule'; # NG
414 eval{ eval 'use NotInstalledModule' }; # OK
13756394 415 }
416
417It seems ridiculous, but it works as you expected.
418
1820fffe 419=head1 SOURCE CODE ACCESS
c3398f5b 420
1820fffe 421We have a public git repository:
c3398f5b 422
2a3e3aa6 423 git clone git://git.moose.perl.org/Mouse.git
c3398f5b 424
1820fffe 425=head1 DEPENDENCIES
262801ef 426
1820fffe 427Perl 5.6.2 or later.
262801ef 428
1820fffe 429=head1 SEE ALSO
e693975f 430
4f74e488 431L<Mouse::Spec>
432
1820fffe 433L<Moose>
e693975f 434
8b13ad67 435L<Moose::Manual>
436
437L<Moose::Cookbook>
438
1820fffe 439L<Class::MOP>
e693975f 440
c817e8f1 441=head1 AUTHORS
c3398f5b 442
1d859d42 443Shawn M Moore E<lt>sartak at gmail.comE<gt>
c3398f5b 444
1d859d42 445Yuval Kogman E<lt>nothingmuch at woobling.orgE<gt>
fc9f8988 446
c817e8f1 447tokuhirom
448
449Yappo
450
ea6dc3a5 451wu-lee
452
434ca269 453Goro Fuji (gfx) E<lt>gfuji at cpan.orgE<gt>
ba55dea1 454
0fff36e6 455with plenty of code borrowed from L<Class::MOP> and L<Moose>
456
c3398f5b 457=head1 BUGS
458
1820fffe 459All complex software has bugs lurking in it, and this module is no exception.
460Please report any bugs to C<bug-mouse at rt.cpan.org>, or through the web
461interface at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Mouse>
c3398f5b 462
463=head1 COPYRIGHT AND LICENSE
464
95ce77e0 465Copyright (c) 2008-2010 Infinity Interactive, Inc.
3ef6ae56 466
467http://www.iinteractive.com/
c3398f5b 468
469This program is free software; you can redistribute it and/or modify it
470under the same terms as Perl itself.
471
472=cut
473