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