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