MouseX::Stop::it!
[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
9090e5fe 237=head2 MouseX
238
239Please don't copy MooseX code to MouseX. If you need extensions, you really
240should upgrade to Moose. We don't need two parallel sets of extensions!
241
242If you really must write a Mouse extension, please contact the Moose mailing
243list or #moose on IRC beforehand.
244
0fff36e6 245=head1 KEYWORDS
c3398f5b 246
306290e8 247=head2 meta -> Mouse::Meta::Class
c3398f5b 248
249Returns this class' metaclass instance.
250
251=head2 extends superclasses
252
253Sets this class' superclasses.
254
b7a74822 255=head2 before (method|methods) => Code
256
257Installs a "before" method modifier. See L<Moose/before> or
258L<Class::Method::Modifiers/before>.
259
6beb7db6 260Use of this feature requires L<Class::Method::Modifiers>!
261
b7a74822 262=head2 after (method|methods) => Code
263
264Installs an "after" method modifier. See L<Moose/after> or
265L<Class::Method::Modifiers/after>.
266
6beb7db6 267Use of this feature requires L<Class::Method::Modifiers>!
268
b7a74822 269=head2 around (method|methods) => Code
270
271Installs an "around" method modifier. See L<Moose/around> or
272L<Class::Method::Modifiers/around>.
273
6beb7db6 274Use of this feature requires L<Class::Method::Modifiers>!
275
c3398f5b 276=head2 has (name|names) => parameters
277
278Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 279this class. Options:
280
281=over 4
282
283=item is => ro|rw
284
285If specified, inlines a read-only/read-write accessor with the same name as
286the attribute.
287
288=item isa => TypeConstraint
289
290Provides basic type checking in the constructor and accessor. Basic types such
291as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
292be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
293objects).
294
295=item required => 0|1
296
297Whether this attribute is required to have a value. If the attribute is lazy or
298has a builder, then providing a value for the attribute in the constructor is
299optional.
300
ca63d17a 301=item init_arg => Str | Undef
0fff36e6 302
ca63d17a 303Allows you to use a different key name in the constructor. If undef, the
304attribue can't be passed to the constructor.
0fff36e6 305
306=item default => Value | CodeRef
307
308Sets the default value of the attribute. If the default is a coderef, it will
309be invoked to get the default value. Due to quirks of Perl, any bare reference
310is forbidden, you must wrap the reference in a coderef. Otherwise, all
311instances will share the same reference.
312
313=item lazy => 0|1
314
315If specified, the default is calculated on demand instead of in the
316constructor.
317
318=item predicate => Str
319
320Lets you specify a method name for installing a predicate method, which checks
321that the attribute has a value. It will not invoke a lazy default or builder
322method.
323
324=item clearer => Str
325
326Lets you specify a method name for installing a clearer method, which clears
327the attribute's value from the instance. On the next read, lazy or builder will
328be invoked.
329
330=item handles => HashRef|ArrayRef
331
332Lets you specify methods to delegate to the attribute. ArrayRef forwards the
333given method names to method calls on the attribute. HashRef maps local method
334names to remote method names called on the attribute. Other forms of
335L</handles>, such as regular expression and coderef, are not yet supported.
336
337=item weak_ref => 0|1
338
339Lets you automatically weaken any reference stored in the attribute.
340
6beb7db6 341Use of this feature requires L<Scalar::Util>!
342
844fa049 343=item trigger => CodeRef
344
345Any 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.
346
6beb7db6 347Mouse 0.05 supported more complex triggers, but this behavior is now removed.
0fff36e6 348
349=item builder => Str
350
351Defines a method name to be called to provide the default value of the
352attribute. C<< builder => 'build_foo' >> is mostly equivalent to
353C<< default => sub { $_[0]->build_foo } >>.
354
355=item auto_deref => 0|1
356
357Allows you to automatically dereference ArrayRef and HashRef attributes in list
358context. In scalar context, the reference is returned (NOT the list length or
359bucket status). You must specify an appropriate type constraint to use
360auto_deref.
361
5253d13d 362=item lazy_build => 0|1
363
364Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
365"clear_$attr', predicate => 'has_$attr' unless they are already defined.
366
0fff36e6 367=back
c3398f5b 368
369=head2 confess error -> BOOM
370
371L<Carp/confess> for your convenience.
372
373=head2 blessed value -> ClassName | undef
374
375L<Scalar::Util/blessed> for your convenience.
376
377=head1 MISC
378
379=head2 import
380
6caea456 381Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 382You may use L</extends> to replace the superclass list.
383
384=head2 unimport
385
0fff36e6 386Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
387keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 388
389=head1 FUNCTIONS
390
391=head2 load_class Class::Name
392
6caea456 393This will load a given C<Class::Name> (or die if it's not loadable).
c3398f5b 394This function can be used in place of tricks like
395C<eval "use $module"> or using C<require>.
396
262801ef 397=head2 is_class_loaded Class::Name -> Bool
398
399Returns whether this class is actually loaded or not. It uses a heuristic which
400involves checking for the existence of C<$VERSION>, C<@ISA>, and any
401locally-defined method.
402
c817e8f1 403=head1 AUTHORS
c3398f5b 404
405Shawn M Moore, C<< <sartak at gmail.com> >>
406
fc9f8988 407Yuval Kogman, C<< <nothingmuch at woobling.org> >>
408
c817e8f1 409tokuhirom
410
411Yappo
412
0fff36e6 413with plenty of code borrowed from L<Class::MOP> and L<Moose>
414
c3398f5b 415=head1 BUGS
416
417No known bugs.
418
419Please report any bugs through RT: email
420C<bug-mouse at rt.cpan.org>, or browse
421L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
422
423=head1 COPYRIGHT AND LICENSE
424
425Copyright 2008 Shawn M Moore.
426
427This program is free software; you can redistribute it and/or modify it
428under the same terms as Perl itself.
429
430=cut
431