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