Checking in changes prior to tagging of version 0.50_01. Changelog diff is:
[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
05a12aa4 6our $VERSION = '0.50_01';
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
05a12aa4 163This document describes Mouse version 0.50_01
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
179 package Point3D;
c3398f5b 180 use Mouse;
181
6caea456 182 extends 'Point';
c3398f5b 183
6caea456 184 has 'z' => (is => 'rw', isa => 'Int');
185
8517d2ff 186 after 'clear' => sub {
187 my $self = shift;
188 $self->z(0);
189 };
c3398f5b 190
191=head1 DESCRIPTION
192
6614c108 193L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 194
16913e71 195Unfortunately, Moose has a compile-time penalty. Though significant progress
196has been made over the years, the compile time penalty is a non-starter for
197some very specific applications. If you are writing a command-line application
198or CGI script where startup time is essential, you may not be able to use
199Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
200latter, if possible.
0fff36e6 201
6614c108 202Mouse aims to alleviate this by providing a subset of Moose's functionality,
203faster.
0fff36e6 204
4f74e488 205We're also going as light on dependencies as possible. Mouse currently has
206B<no dependencies> except for testing modules.
d1c1b994 207
1820fffe 208=head2 MOOSE COMPATIBILITY
0fff36e6 209
210Compatibility with Moose has been the utmost concern. Fewer than 1% of the
211tests fail when run against Moose instead of Mouse. Mouse code coverage is also
7e3ed32e 212over 96%. Even the error messages are taken from Moose. The Mouse code just
213runs the test suite 4x faster.
0fff36e6 214
215The idea is that, if you need the extra power, you should be able to run
8e1a28a8 216C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
6614c108 217we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
16913e71 218in which case it will act as Moose. Since Mouse is a little sloppier than
219Moose, if you run into weird errors, it would be worth running:
220
221 ANY_MOOSE=Moose perl your-script.pl
222
223to see if the bug is caused by Mouse. Moose's diagnostics and validation are
224also much better.
0fff36e6 225
4f74e488 226See also L<Mouse::Spec> for compatibility and incompatibility with Moose.
227
9090e5fe 228=head2 MouseX
229
230Please don't copy MooseX code to MouseX. If you need extensions, you really
231should upgrade to Moose. We don't need two parallel sets of extensions!
232
233If you really must write a Mouse extension, please contact the Moose mailing
234list or #moose on IRC beforehand.
235
0fff36e6 236=head1 KEYWORDS
c3398f5b 237
1820fffe 238=head2 C<< $object->meta -> Mouse::Meta::Class >>
c3398f5b 239
240Returns this class' metaclass instance.
241
1820fffe 242=head2 C<< extends superclasses >>
c3398f5b 243
244Sets this class' superclasses.
245
b0b9f25a 246=head2 C<< before (method|methods|regexp) => CodeRef >>
b7a74822 247
8b13ad67 248Installs a "before" method modifier. See L<Moose/before>.
6beb7db6 249
b0b9f25a 250=head2 C<< after (method|methods|regexp) => CodeRef >>
b7a74822 251
8b13ad67 252Installs an "after" method modifier. See L<Moose/after>.
ed940a7a 253
b0b9f25a 254=head2 C<< around (method|methods|regexp) => CodeRef >>
b7a74822 255
8b13ad67 256Installs an "around" method modifier. See L<Moose/around>.
ed940a7a 257
1820fffe 258=head2 C<< has (name|names) => parameters >>
c3398f5b 259
260Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 261this class. Options:
262
263=over 4
264
1820fffe 265=item C<< is => ro|rw|bare >>
0fff36e6 266
b940eb46 267The I<is> option accepts either I<rw> (for read/write), I<ro> (for read
268only) or I<bare> (for nothing). These will create either a read/write accessor
269or a read-only accessor respectively, using the same name as the C<$name> of
0fff36e6 270the attribute.
271
b940eb46 272If you need more control over how your accessors are named, you can
273use the C<reader>, C<writer> and C<accessor> options, however if you
274use those, you won't need the I<is> option.
275
276=item C<< isa => TypeName | ClassName >>
0fff36e6 277
5893ee36 278Provides type checking in the constructor and accessor. The following types are
1820fffe 279supported. Any unknown type is taken to be a class check
280(e.g. C<< isa => 'DateTime' >> would accept only L<DateTime> objects).
5893ee36 281
282 Any Item Bool Undef Defined Value Num Int Str ClassName
283 Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
284 FileHandle Object
285
286For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
287
b940eb46 288=item C<< does => RoleName >>
289
290This will accept the name of a role which the value stored in this attribute
291is expected to have consumed.
292
293=item C<< coerce => Bool >>
294
295This will attempt to use coercion with the supplied type constraint to change
296the value passed into any accessors or constructors. You B<must> have supplied
297a type constraint in order for this to work. See L<Moose::Cookbook::Basics::Recipe5>
298for an example.
0fff36e6 299
1820fffe 300=item C<< required => Bool >>
0fff36e6 301
302Whether this attribute is required to have a value. If the attribute is lazy or
303has a builder, then providing a value for the attribute in the constructor is
304optional.
305
1820fffe 306=item C<< init_arg => Str | Undef >>
0fff36e6 307
ca63d17a 308Allows you to use a different key name in the constructor. If undef, the
1820fffe 309attribute can't be passed to the constructor.
0fff36e6 310
1820fffe 311=item C<< default => Value | CodeRef >>
0fff36e6 312
313Sets the default value of the attribute. If the default is a coderef, it will
314be invoked to get the default value. Due to quirks of Perl, any bare reference
315is forbidden, you must wrap the reference in a coderef. Otherwise, all
316instances will share the same reference.
317
1820fffe 318=item C<< lazy => Bool >>
0fff36e6 319
320If specified, the default is calculated on demand instead of in the
321constructor.
322
1820fffe 323=item C<< predicate => Str >>
0fff36e6 324
325Lets you specify a method name for installing a predicate method, which checks
326that the attribute has a value. It will not invoke a lazy default or builder
327method.
328
1820fffe 329=item C<< clearer => Str >>
0fff36e6 330
331Lets you specify a method name for installing a clearer method, which clears
332the attribute's value from the instance. On the next read, lazy or builder will
333be invoked.
334
b940eb46 335=item C<< handles => HashRef|ArrayRef|Regexp >>
0fff36e6 336
337Lets you specify methods to delegate to the attribute. ArrayRef forwards the
338given method names to method calls on the attribute. HashRef maps local method
339names to remote method names called on the attribute. Other forms of
b940eb46 340L</handles>, such as RoleName and CodeRef, are not yet supported.
0fff36e6 341
1820fffe 342=item C<< weak_ref => Bool >>
0fff36e6 343
344Lets you automatically weaken any reference stored in the attribute.
345
6beb7db6 346Use of this feature requires L<Scalar::Util>!
347
1820fffe 348=item C<< trigger => CodeRef >>
844fa049 349
350Any 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.
351
1820fffe 352=item C<< builder => Str >>
0fff36e6 353
354Defines a method name to be called to provide the default value of the
355attribute. C<< builder => 'build_foo' >> is mostly equivalent to
356C<< default => sub { $_[0]->build_foo } >>.
357
1820fffe 358=item C<< auto_deref => Bool >>
0fff36e6 359
360Allows you to automatically dereference ArrayRef and HashRef attributes in list
361context. In scalar context, the reference is returned (NOT the list length or
362bucket status). You must specify an appropriate type constraint to use
363auto_deref.
364
1820fffe 365=item C<< lazy_build => Bool >>
366
367Automatically define the following options:
5253d13d 368
1820fffe 369 has $attr => (
370 # ...
371 lazy => 1
372 builder => "_build_$attr",
373 clearer => "clear_$attr",
374 predicate => "has_$attr",
375 );
5253d13d 376
0fff36e6 377=back
c3398f5b 378
1820fffe 379=head2 C<< confess(message) -> BOOM >>
c3398f5b 380
381L<Carp/confess> for your convenience.
382
1820fffe 383=head2 C<< blessed(value) -> ClassName | undef >>
c3398f5b 384
385L<Scalar::Util/blessed> for your convenience.
386
387=head1 MISC
388
389=head2 import
390
6caea456 391Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 392You may use L</extends> to replace the superclass list.
393
394=head2 unimport
395
0fff36e6 396Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
397keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 398
13756394 399=head1 CAVEATS
400
5f692270 401If you use Mouse::XS you might see a fatal error on callbacks
1a8951d1 402which include C<eval 'BEGIN{ die }'>, which typically occurs in such code
403as C<eval 'use NotInstalledModule'>. This is not
13756394 404a bug in Mouse. In fact, it is a bug in Perl (RT #69939).
405
406To work around this problem, surround C<eval STRING> with C<eval BLOCK>:
407
408 sub callback {
5f692270 409 # eval 'use NotInstalledModule'; # NG
410 eval{ eval 'use NotInstalledModule' }; # OK
13756394 411 }
412
413It seems ridiculous, but it works as you expected.
414
1820fffe 415=head1 SOURCE CODE ACCESS
c3398f5b 416
1820fffe 417We have a public git repository:
c3398f5b 418
2a3e3aa6 419 git clone git://git.moose.perl.org/Mouse.git
c3398f5b 420
1820fffe 421=head1 DEPENDENCIES
262801ef 422
1820fffe 423Perl 5.6.2 or later.
262801ef 424
1820fffe 425=head1 SEE ALSO
e693975f 426
4f74e488 427L<Mouse::Spec>
428
1820fffe 429L<Moose>
e693975f 430
8b13ad67 431L<Moose::Manual>
432
433L<Moose::Cookbook>
434
1820fffe 435L<Class::MOP>
e693975f 436
c817e8f1 437=head1 AUTHORS
c3398f5b 438
1d859d42 439Shawn M Moore E<lt>sartak at gmail.comE<gt>
c3398f5b 440
1d859d42 441Yuval Kogman E<lt>nothingmuch at woobling.orgE<gt>
fc9f8988 442
c817e8f1 443tokuhirom
444
445Yappo
446
ea6dc3a5 447wu-lee
448
434ca269 449Goro Fuji (gfx) E<lt>gfuji at cpan.orgE<gt>
ba55dea1 450
0fff36e6 451with plenty of code borrowed from L<Class::MOP> and L<Moose>
452
c3398f5b 453=head1 BUGS
454
1820fffe 455All complex software has bugs lurking in it, and this module is no exception.
456Please report any bugs to C<bug-mouse at rt.cpan.org>, or through the web
457interface at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Mouse>
c3398f5b 458
459=head1 COPYRIGHT AND LICENSE
460
95ce77e0 461Copyright (c) 2008-2010 Infinity Interactive, Inc.
3ef6ae56 462
463http://www.iinteractive.com/
c3398f5b 464
465This program is free software; you can redistribute it and/or modify it
466under the same terms as Perl itself.
467
468=cut
469