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