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