Refactoring
[gitmo/Mouse.git] / lib / Mouse.pm
1 package Mouse;
2 use strict;
3 use warnings;
4 use 5.006;
5 use base 'Exporter';
6
7 our $VERSION = '0.30';
8
9 use Carp 'confess';
10 use Scalar::Util 'blessed';
11 use Mouse::Util;
12
13 use Mouse::Meta::Attribute;
14 use Mouse::Meta::Class;
15 use Mouse::Object;
16 use Mouse::Util::TypeConstraints;
17
18 our @EXPORT = qw(extends has before after around override super blessed confess with);
19
20 our %is_removable = map{ $_ => undef } @EXPORT;
21 delete $is_removable{blessed};
22 delete $is_removable{confess};
23
24 sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) }
25
26 sub has {
27     my $meta = Mouse::Meta::Class->initialize(caller);
28     $meta->add_attribute(@_);
29 }
30
31 sub before {
32     my $meta = Mouse::Meta::Class->initialize(caller);
33
34     my $code = pop;
35
36     for (@_) {
37         $meta->add_before_method_modifier($_ => $code);
38     }
39 }
40
41 sub after {
42     my $meta = Mouse::Meta::Class->initialize(caller);
43
44     my $code = pop;
45
46     for (@_) {
47         $meta->add_after_method_modifier($_ => $code);
48     }
49 }
50
51 sub around {
52     my $meta = Mouse::Meta::Class->initialize(caller);
53
54     my $code = pop;
55
56     for (@_) {
57         $meta->add_around_method_modifier($_ => $code);
58     }
59 }
60
61 sub with {
62     Mouse::Util::apply_all_roles((caller)[0], @_);
63 }
64
65 our $SUPER_PACKAGE;
66 our $SUPER_BODY;
67 our @SUPER_ARGS;
68
69 sub super {
70     # This check avoids a recursion loop - see
71     # t/100_bugs/020_super_recursion.t
72     return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller();
73     return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS);
74 }
75
76 sub override {
77     my $meta = Mouse::Meta::Class->initialize(caller);
78     my $pkg = $meta->name;
79
80     my $name = shift;
81     my $code = shift;
82
83     my $body = $pkg->can($name)
84         or confess "You cannot override '$name' because it has no super method";
85
86     $meta->add_method($name => sub {
87         local $SUPER_PACKAGE = $pkg;
88         local @SUPER_ARGS = @_;
89         local $SUPER_BODY = $body;
90
91         $code->(@_);
92     });
93 }
94
95 sub init_meta {
96     # This used to be called as a function. This hack preserves
97     # backwards compatibility.
98     if ( $_[0] ne __PACKAGE__ ) {
99         return __PACKAGE__->init_meta(
100             for_class  => $_[0],
101             base_class => $_[1],
102             metaclass  => $_[2],
103         );
104     }
105
106     shift;
107     my %args = @_;
108
109     my $class = $args{for_class}
110       or Carp::croak(
111         "Cannot call init_meta without specifying a for_class");
112     my $base_class = $args{base_class} || 'Mouse::Object';
113     my $metaclass  = $args{metaclass}  || 'Mouse::Meta::Class';
114
115     Carp::croak("The Metaclass $metaclass must be a subclass of Mouse::Meta::Class.")
116             unless $metaclass->isa('Mouse::Meta::Class');
117     
118     # make a subtype for each Mouse class
119     class_type($class)
120         unless find_type_constraint($class);
121
122     my $meta = $metaclass->initialize($class);
123     $meta->superclasses($base_class)
124         unless $meta->superclasses;
125
126     $meta->add_method(meta => sub{
127         return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
128     });
129
130
131     return $meta;
132 }
133
134 sub import {
135     my $class = shift;
136
137     strict->import;
138     warnings->import;
139
140     my $opts = do {
141         if (ref($_[0]) && ref($_[0]) eq 'HASH') {
142             shift @_;
143         } else {
144             +{ };
145         }
146     };
147     my $level = delete $opts->{into_level};
148        $level = 0 unless defined $level;
149     my $caller = caller($level);
150
151     # we should never export to main
152     if ($caller eq 'main') {
153         warn qq{$class does not export its sugar to the 'main' package.\n};
154         return;
155     }
156
157     Mouse->init_meta(
158         for_class  => $caller,
159     );
160
161     if (@_) {
162         __PACKAGE__->export_to_level( $level+1, $class, @_);
163     } else {
164         # shortcut for the common case of no type character
165         no strict 'refs';
166         for my $keyword (@EXPORT) {
167             *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
168         }
169     }
170 }
171
172 sub unimport {
173     my $caller = caller;
174
175     my $stash = do{
176         no strict 'refs';
177         \%{$caller . '::'}
178     };
179
180     for my $keyword (@EXPORT) {
181         my $code;
182         if(exists $is_removable{$keyword}
183             && ($code = $caller->can($keyword))
184             && (Mouse::Util::get_code_info($code))[0] eq __PACKAGE__){
185
186             delete $stash->{$keyword};
187         }
188     }
189 }
190
191 sub load_class {
192     my $class = shift;
193
194     if (ref($class) || !defined($class) || !length($class)) {
195         my $display = defined($class) ? $class : 'undef';
196         confess "Invalid class name ($display)";
197     }
198
199     return 1 if $class eq 'Mouse::Object';
200     return 1 if is_class_loaded($class);
201
202     (my $file = "$class.pm") =~ s{::}{/}g;
203
204     eval { CORE::require($file) };
205     confess "Could not load class ($class) because : $@" if $@;
206
207     return 1;
208 }
209
210 sub is_class_loaded {
211     my $class = shift;
212
213     return 0 if ref($class) || !defined($class) || !length($class);
214
215     # walk the symbol table tree to avoid autovififying
216     # \*{${main::}{"Foo::"}} == \*main::Foo::
217
218     my $pack = \*::;
219     foreach my $part (split('::', $class)) {
220         return 0 unless exists ${$$pack}{"${part}::"};
221         $pack = \*{${$$pack}{"${part}::"}};
222     }
223
224     # check for $VERSION or @ISA
225     return 1 if exists ${$$pack}{VERSION}
226              && defined *{${$$pack}{VERSION}}{SCALAR};
227     return 1 if exists ${$$pack}{ISA}
228              && defined *{${$$pack}{ISA}}{ARRAY};
229
230     # check for any method
231     foreach ( keys %{$$pack} ) {
232         next if substr($_, -2, 2) eq '::';
233         return 1 if defined *{${$$pack}{$_}}{CODE};
234     }
235
236     # fail
237     return 0;
238 }
239
240 sub class_of {
241     return Mouse::Meta::Class::class_of($_[0]);
242 }
243
244 1;
245
246 __END__
247
248 =head1 NAME
249
250 Mouse - Moose minus the antlers
251
252 =head1 SYNOPSIS
253
254     package Point;
255     use Mouse; # automatically turns on strict and warnings
256
257     has 'x' => (is => 'rw', isa => 'Int');
258     has 'y' => (is => 'rw', isa => 'Int');
259
260     sub clear {
261         my $self = shift;
262         $self->x(0);
263         $self->y(0);
264     }
265
266     package Point3D;
267     use Mouse;
268
269     extends 'Point';
270
271     has 'z' => (is => 'rw', isa => 'Int');
272
273     after 'clear' => sub {
274         my $self = shift;
275         $self->z(0);
276     };
277
278 =head1 DESCRIPTION
279
280 L<Moose> is wonderful. B<Use Moose instead of Mouse.>
281
282 Unfortunately, Moose has a compile-time penalty. Though significant progress
283 has been made over the years, the compile time penalty is a non-starter for
284 some very specific applications. If you are writing a command-line application
285 or CGI script where startup time is essential, you may not be able to use
286 Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
287 latter, if possible.
288
289 Mouse aims to alleviate this by providing a subset of Moose's functionality,
290 faster.
291
292 We're also going as light on dependencies as possible.
293 L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
294 if you want support for L</before>, L</after>, and L</around>.
295
296 =head2 MOOSE COMPAT
297
298 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
299 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
300 over 96%. Even the error messages are taken from Moose. The Mouse code just
301 runs the test suite 4x faster.
302
303 The idea is that, if you need the extra power, you should be able to run
304 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
305 we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
306 in which case it will act as Moose. Since Mouse is a little sloppier than
307 Moose, if you run into weird errors, it would be worth running:
308
309     ANY_MOOSE=Moose perl your-script.pl
310
311 to see if the bug is caused by Mouse. Moose's diagnostics and validation are
312 also much better.
313
314 =head2 MouseX
315
316 Please don't copy MooseX code to MouseX. If you need extensions, you really
317 should upgrade to Moose. We don't need two parallel sets of extensions!
318
319 If you really must write a Mouse extension, please contact the Moose mailing
320 list or #moose on IRC beforehand.
321
322 =head2 Maintenance
323
324 The original author of this module has mostly stepped down from maintaining
325 Mouse. See L<http://www.nntp.perl.org/group/perl.moose/2009/04/msg653.html>.
326 If you would like to help maintain this module, please get in touch with us.
327
328 =head1 KEYWORDS
329
330 =head2 meta -> Mouse::Meta::Class
331
332 Returns this class' metaclass instance.
333
334 =head2 extends superclasses
335
336 Sets this class' superclasses.
337
338 =head2 before (method|methods) => Code
339
340 Installs a "before" method modifier. See L<Moose/before> or
341 L<Class::Method::Modifiers/before>.
342
343 Use of this feature requires L<Class::Method::Modifiers>!
344
345 =head2 after (method|methods) => Code
346
347 Installs an "after" method modifier. See L<Moose/after> or
348 L<Class::Method::Modifiers/after>.
349
350 Use of this feature requires L<Class::Method::Modifiers>!
351
352 =head2 around (method|methods) => Code
353
354 Installs an "around" method modifier. See L<Moose/around> or
355 L<Class::Method::Modifiers/around>.
356
357 Use of this feature requires L<Class::Method::Modifiers>!
358
359 =head2 has (name|names) => parameters
360
361 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
362 this class. Options:
363
364 =over 4
365
366 =item is => ro|rw
367
368 If specified, inlines a read-only/read-write accessor with the same name as
369 the attribute.
370
371 =item isa => TypeConstraint
372
373 Provides type checking in the constructor and accessor. The following types are
374 supported. Any unknown type is taken to be a class check (e.g. isa =>
375 'DateTime' would accept only L<DateTime> objects).
376
377     Any Item Bool Undef Defined Value Num Int Str ClassName
378     Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
379     FileHandle Object
380
381 For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
382
383
384 =item required => 0|1
385
386 Whether this attribute is required to have a value. If the attribute is lazy or
387 has a builder, then providing a value for the attribute in the constructor is
388 optional.
389
390 =item init_arg => Str | Undef
391
392 Allows you to use a different key name in the constructor.  If undef, the
393 attribue can't be passed to the constructor.
394
395 =item default => Value | CodeRef
396
397 Sets the default value of the attribute. If the default is a coderef, it will
398 be invoked to get the default value. Due to quirks of Perl, any bare reference
399 is forbidden, you must wrap the reference in a coderef. Otherwise, all
400 instances will share the same reference.
401
402 =item lazy => 0|1
403
404 If specified, the default is calculated on demand instead of in the
405 constructor.
406
407 =item predicate => Str
408
409 Lets you specify a method name for installing a predicate method, which checks
410 that the attribute has a value. It will not invoke a lazy default or builder
411 method.
412
413 =item clearer => Str
414
415 Lets you specify a method name for installing a clearer method, which clears
416 the attribute's value from the instance. On the next read, lazy or builder will
417 be invoked.
418
419 =item handles => HashRef|ArrayRef
420
421 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
422 given method names to method calls on the attribute. HashRef maps local method
423 names to remote method names called on the attribute. Other forms of
424 L</handles>, such as regular expression and coderef, are not yet supported.
425
426 =item weak_ref => 0|1
427
428 Lets you automatically weaken any reference stored in the attribute.
429
430 Use of this feature requires L<Scalar::Util>!
431
432 =item trigger => CodeRef
433
434 Any 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.
435
436 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
437
438 =item builder => Str
439
440 Defines a method name to be called to provide the default value of the
441 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
442 C<< default => sub { $_[0]->build_foo } >>.
443
444 =item auto_deref => 0|1
445
446 Allows you to automatically dereference ArrayRef and HashRef attributes in list
447 context. In scalar context, the reference is returned (NOT the list length or
448 bucket status). You must specify an appropriate type constraint to use
449 auto_deref.
450
451 =item lazy_build => 0|1
452
453 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
454 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
455
456 =back
457
458 =head2 confess error -> BOOM
459
460 L<Carp/confess> for your convenience.
461
462 =head2 blessed value -> ClassName | undef
463
464 L<Scalar::Util/blessed> for your convenience.
465
466 =head1 MISC
467
468 =head2 import
469
470 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
471 You may use L</extends> to replace the superclass list.
472
473 =head2 unimport
474
475 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
476 keywords (such as L</extends>) it will break loudly instead breaking subtly.
477
478 =head1 FUNCTIONS
479
480 =head2 load_class Class::Name
481
482 This will load a given C<Class::Name> (or die if it's not loadable).
483 This function can be used in place of tricks like
484 C<eval "use $module"> or using C<require>.
485
486 =head2 is_class_loaded Class::Name -> Bool
487
488 Returns whether this class is actually loaded or not. It uses a heuristic which
489 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
490 locally-defined method.
491
492 =head1 SOURCE CODE ACCESS
493
494 We have a public git repo:
495
496  git clone git://jules.scsys.co.uk/gitmo/Mouse.git
497
498 =head1 AUTHORS
499
500 Shawn M Moore, C<< <sartak at gmail.com> >>
501
502 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
503
504 tokuhirom
505
506 Yappo
507
508 wu-lee
509
510 with plenty of code borrowed from L<Class::MOP> and L<Moose>
511
512 =head1 BUGS
513
514 There is a known issue with Mouse on 5.6.2 regarding the @ISA tests. Until
515 this is resolve the minimum version of Perl for Mouse is set to 5.8.0. Patches
516 to resolve these tests are more than welcome.
517
518 Please report any bugs through RT: email
519 C<bug-mouse at rt.cpan.org>, or browse
520 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
521
522 =head1 COPYRIGHT AND LICENSE
523
524 Copyright 2008-2009 Infinity Interactive, Inc.
525
526 http://www.iinteractive.com/
527
528 This program is free software; you can redistribute it and/or modify it
529 under the same terms as Perl itself.
530
531 =cut
532