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