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