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