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