Cleanup
[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 (!Mouse::Util::is_valid_class_name($class)) {
195         my $display = defined($class) ? $class : 'undef';
196         confess "Invalid class name ($display)";
197     }
198
199     return 1 if is_class_loaded($class);
200
201     (my $file = "$class.pm") =~ s{::}{/}g;
202
203     eval { CORE::require($file) };
204     confess "Could not load class ($class) because : $@" if $@;
205
206     return 1;
207 }
208
209 my %is_class_loaded_cache;
210 sub is_class_loaded {
211     my $class = shift;
212
213     return 0 if ref($class) || !defined($class) || !length($class);
214
215     return 1 if exists $is_class_loaded_cache{$class};
216
217     # walk the symbol table tree to avoid autovififying
218     # \*{${main::}{"Foo::"}} == \*main::Foo::
219
220     my $pack = \*::;
221     foreach my $part (split('::', $class)) {
222         return 0 unless exists ${$$pack}{"${part}::"};
223         $pack = \*{${$$pack}{"${part}::"}};
224     }
225
226     # check for $VERSION or @ISA
227     return ++$is_class_loaded_cache{$class} if exists ${$$pack}{VERSION}
228              && defined *{${$$pack}{VERSION}}{SCALAR};
229     return ++$is_class_loaded_cache{$class} if exists ${$$pack}{ISA}
230              && defined *{${$$pack}{ISA}}{ARRAY};
231
232     # check for any method
233     foreach ( keys %{$$pack} ) {
234         next if substr($_, -2, 2) eq '::';
235         return ++$is_class_loaded_cache{$class} if defined *{${$$pack}{$_}}{CODE};
236     }
237
238     # fail
239     return 0;
240 }
241
242 sub class_of {
243     return Mouse::Meta::Class::class_of($_[0]);
244 }
245
246 1;
247
248 __END__
249
250 =head1 NAME
251
252 Mouse - Moose minus the antlers
253
254 =head1 SYNOPSIS
255
256     package Point;
257     use Mouse; # automatically turns on strict and warnings
258
259     has 'x' => (is => 'rw', isa => 'Int');
260     has 'y' => (is => 'rw', isa => 'Int');
261
262     sub clear {
263         my $self = shift;
264         $self->x(0);
265         $self->y(0);
266     }
267
268     package Point3D;
269     use Mouse;
270
271     extends 'Point';
272
273     has 'z' => (is => 'rw', isa => 'Int');
274
275     after 'clear' => sub {
276         my $self = shift;
277         $self->z(0);
278     };
279
280 =head1 DESCRIPTION
281
282 L<Moose> is wonderful. B<Use Moose instead of Mouse.>
283
284 Unfortunately, Moose has a compile-time penalty. Though significant progress
285 has been made over the years, the compile time penalty is a non-starter for
286 some very specific applications. If you are writing a command-line application
287 or CGI script where startup time is essential, you may not be able to use
288 Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
289 latter, if possible.
290
291 Mouse aims to alleviate this by providing a subset of Moose's functionality,
292 faster.
293
294 We're also going as light on dependencies as possible.
295 L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
296 if you want support for L</before>, L</after>, and L</around>.
297
298 =head2 MOOSE COMPAT
299
300 Compatibility with Moose has been the utmost concern. Fewer than 1% of the
301 tests fail when run against Moose instead of Mouse. Mouse code coverage is also
302 over 96%. Even the error messages are taken from Moose. The Mouse code just
303 runs the test suite 4x faster.
304
305 The idea is that, if you need the extra power, you should be able to run
306 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
307 we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
308 in which case it will act as Moose. Since Mouse is a little sloppier than
309 Moose, if you run into weird errors, it would be worth running:
310
311     ANY_MOOSE=Moose perl your-script.pl
312
313 to see if the bug is caused by Mouse. Moose's diagnostics and validation are
314 also much better.
315
316 =head2 MouseX
317
318 Please don't copy MooseX code to MouseX. If you need extensions, you really
319 should upgrade to Moose. We don't need two parallel sets of extensions!
320
321 If you really must write a Mouse extension, please contact the Moose mailing
322 list or #moose on IRC beforehand.
323
324 =head2 Maintenance
325
326 The original author of this module has mostly stepped down from maintaining
327 Mouse. See L<http://www.nntp.perl.org/group/perl.moose/2009/04/msg653.html>.
328 If you would like to help maintain this module, please get in touch with us.
329
330 =head1 KEYWORDS
331
332 =head2 meta -> Mouse::Meta::Class
333
334 Returns this class' metaclass instance.
335
336 =head2 extends superclasses
337
338 Sets this class' superclasses.
339
340 =head2 before (method|methods) => Code
341
342 Installs a "before" method modifier. See L<Moose/before> or
343 L<Class::Method::Modifiers/before>.
344
345 Use of this feature requires L<Class::Method::Modifiers>!
346
347 =head2 after (method|methods) => Code
348
349 Installs an "after" method modifier. See L<Moose/after> or
350 L<Class::Method::Modifiers/after>.
351
352 Use of this feature requires L<Class::Method::Modifiers>!
353
354 =head2 around (method|methods) => Code
355
356 Installs an "around" method modifier. See L<Moose/around> or
357 L<Class::Method::Modifiers/around>.
358
359 Use of this feature requires L<Class::Method::Modifiers>!
360
361 =head2 has (name|names) => parameters
362
363 Adds an attribute (or if passed an arrayref of names, multiple attributes) to
364 this class. Options:
365
366 =over 4
367
368 =item is => ro|rw
369
370 If specified, inlines a read-only/read-write accessor with the same name as
371 the attribute.
372
373 =item isa => TypeConstraint
374
375 Provides type checking in the constructor and accessor. The following types are
376 supported. Any unknown type is taken to be a class check (e.g. isa =>
377 'DateTime' would accept only L<DateTime> objects).
378
379     Any Item Bool Undef Defined Value Num Int Str ClassName
380     Ref ScalarRef ArrayRef HashRef CodeRef RegexpRef GlobRef
381     FileHandle Object
382
383 For more documentation on type constraints, see L<Mouse::Util::TypeConstraints>.
384
385
386 =item required => 0|1
387
388 Whether this attribute is required to have a value. If the attribute is lazy or
389 has a builder, then providing a value for the attribute in the constructor is
390 optional.
391
392 =item init_arg => Str | Undef
393
394 Allows you to use a different key name in the constructor.  If undef, the
395 attribue can't be passed to the constructor.
396
397 =item default => Value | CodeRef
398
399 Sets the default value of the attribute. If the default is a coderef, it will
400 be invoked to get the default value. Due to quirks of Perl, any bare reference
401 is forbidden, you must wrap the reference in a coderef. Otherwise, all
402 instances will share the same reference.
403
404 =item lazy => 0|1
405
406 If specified, the default is calculated on demand instead of in the
407 constructor.
408
409 =item predicate => Str
410
411 Lets you specify a method name for installing a predicate method, which checks
412 that the attribute has a value. It will not invoke a lazy default or builder
413 method.
414
415 =item clearer => Str
416
417 Lets you specify a method name for installing a clearer method, which clears
418 the attribute's value from the instance. On the next read, lazy or builder will
419 be invoked.
420
421 =item handles => HashRef|ArrayRef
422
423 Lets you specify methods to delegate to the attribute. ArrayRef forwards the
424 given method names to method calls on the attribute. HashRef maps local method
425 names to remote method names called on the attribute. Other forms of
426 L</handles>, such as regular expression and coderef, are not yet supported.
427
428 =item weak_ref => 0|1
429
430 Lets you automatically weaken any reference stored in the attribute.
431
432 Use of this feature requires L<Scalar::Util>!
433
434 =item trigger => CodeRef
435
436 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.
437
438 Mouse 0.05 supported more complex triggers, but this behavior is now removed.
439
440 =item builder => Str
441
442 Defines a method name to be called to provide the default value of the
443 attribute. C<< builder => 'build_foo' >> is mostly equivalent to
444 C<< default => sub { $_[0]->build_foo } >>.
445
446 =item auto_deref => 0|1
447
448 Allows you to automatically dereference ArrayRef and HashRef attributes in list
449 context. In scalar context, the reference is returned (NOT the list length or
450 bucket status). You must specify an appropriate type constraint to use
451 auto_deref.
452
453 =item lazy_build => 0|1
454
455 Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
456 "clear_$attr', predicate => 'has_$attr' unless they are already defined.
457
458 =back
459
460 =head2 confess error -> BOOM
461
462 L<Carp/confess> for your convenience.
463
464 =head2 blessed value -> ClassName | undef
465
466 L<Scalar::Util/blessed> for your convenience.
467
468 =head1 MISC
469
470 =head2 import
471
472 Importing Mouse will default your class' superclass list to L<Mouse::Object>.
473 You may use L</extends> to replace the superclass list.
474
475 =head2 unimport
476
477 Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
478 keywords (such as L</extends>) it will break loudly instead breaking subtly.
479
480 =head1 FUNCTIONS
481
482 =head2 load_class Class::Name
483
484 This will load a given C<Class::Name> (or die if it's not loadable).
485 This function can be used in place of tricks like
486 C<eval "use $module"> or using C<require>.
487
488 =head2 is_class_loaded Class::Name -> Bool
489
490 Returns whether this class is actually loaded or not. It uses a heuristic which
491 involves checking for the existence of C<$VERSION>, C<@ISA>, and any
492 locally-defined method.
493
494 =head1 SOURCE CODE ACCESS
495
496 We have a public git repo:
497
498  git clone git://jules.scsys.co.uk/gitmo/Mouse.git
499
500 =head1 AUTHORS
501
502 Shawn M Moore, C<< <sartak at gmail.com> >>
503
504 Yuval Kogman, C<< <nothingmuch at woobling.org> >>
505
506 tokuhirom
507
508 Yappo
509
510 wu-lee
511
512 with plenty of code borrowed from L<Class::MOP> and L<Moose>
513
514 =head1 BUGS
515
516 There is a known issue with Mouse on 5.6.2 regarding the @ISA tests. Until
517 this is resolve the minimum version of Perl for Mouse is set to 5.8.0. Patches
518 to resolve these tests are more than welcome.
519
520 Please report any bugs through RT: email
521 C<bug-mouse at rt.cpan.org>, or browse
522 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
523
524 =head1 COPYRIGHT AND LICENSE
525
526 Copyright 2008-2009 Infinity Interactive, Inc.
527
528 http://www.iinteractive.com/
529
530 This program is free software; you can redistribute it and/or modify it
531 under the same terms as Perl itself.
532
533 =cut
534