support Mouse->import({into_level => 1}).
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1package Mouse;
2use strict;
3use warnings;
eae80759 4use 5.006;
eaad7dab 5use base 'Exporter';
c3398f5b 6
c3a83939 7our $VERSION = '0.18';
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
e6007308 26our @EXPORT = qw(extends has before after around override super blessed confess with);
eaad7dab 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);
abfdffe0 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 }
eaad7dab 47
48 for my $name (@$names) {
49 if ($name =~ s/^\+//) {
abfdffe0 50 $metaclass->clone_parent($meta, $name, @_);
eaad7dab 51 }
52 else {
abfdffe0 53 $metaclass->create($meta, $name, @_);
c3398f5b 54 }
55 }
eaad7dab 56}
57
58sub 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
68sub 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
78sub 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
88sub with {
21498b08 89 Mouse::Util::apply_all_roles((caller)[0], @_);
eaad7dab 90}
91
e6007308 92our $SUPER_PACKAGE;
93our $SUPER_BODY;
94our @SUPER_ARGS;
95
96sub 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
103sub 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
eaad7dab 122sub import {
e15d73d2 123 my $class = shift;
124
eaad7dab 125 strict->import;
126 warnings->import;
127
bfcc8a05 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);
eaad7dab 138
7daedfff 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
eaad7dab 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
e15d73d2 153 if (@_) {
bfcc8a05 154 __PACKAGE__->export_to_level( $level+1, $class, @_);
e15d73d2 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 }
eaad7dab 162}
163
164sub unimport {
165 my $caller = caller;
166
167 no strict 'refs';
168 for my $keyword (@EXPORT) {
169 delete ${ $caller . '::' }{$keyword};
170 }
171}
c3398f5b 172
173sub load_class {
174 my $class = shift;
262801ef 175
9694b71b 176 if (ref($class) || !defined($class) || !length($class)) {
177 my $display = defined($class) ? $class : 'undef';
178 confess "Invalid class name ($display)";
179 }
c3398f5b 180
6c169c50 181 return 1 if $class eq 'Mouse::Object';
2a674d23 182 return 1 if is_class_loaded($class);
183
c3398f5b 184 (my $file = "$class.pm") =~ s{::}{/}g;
185
186 eval { CORE::require($file) };
2a674d23 187 confess "Could not load class ($class) because : $@" if $@;
c3398f5b 188
189 return 1;
190}
191
2a674d23 192sub is_class_loaded {
193 my $class = shift;
194
7ecc2123 195 return 0 if ref($class) || !defined($class) || !length($class);
196
bf134049 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}::"}};
2a674d23 204 }
bf134049 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
2a674d23 219 return 0;
220}
221
c3398f5b 2221;
223
224__END__
225
226=head1 NAME
227
0fff36e6 228Mouse - Moose minus the antlers
c3398f5b 229
c3398f5b 230=head1 SYNOPSIS
231
232 package Point;
6caea456 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;
c3398f5b 245 use Mouse;
246
6caea456 247 extends 'Point';
c3398f5b 248
6caea456 249 has 'z' => (is => 'rw', isa => 'Int');
250
8517d2ff 251 after 'clear' => sub {
252 my $self = shift;
253 $self->z(0);
254 };
c3398f5b 255
256=head1 DESCRIPTION
257
0fff36e6 258L<Moose> is wonderful.
c3398f5b 259
0fff36e6 260Unfortunately, it's a little slow. Though significant progress has been made
261over the years, the compile time penalty is a non-starter for some
262applications.
263
264Mouse aims to alleviate this by providing a subset of Moose's
265functionality, faster. In particular, L<Moose/has> is missing only a few
266expert-level features.
267
7ca75105 268We're also going as light on dependencies as possible.
269L<Class::Method::Modifiers> or L<Data::Util> is required if you want support
270for L</before>, L</after>, and L</around>.
d1c1b994 271
0fff36e6 272=head2 MOOSE COMPAT
273
274Compatibility with Moose has been the utmost concern. Fewer than 1% of the
275tests fail when run against Moose instead of Mouse. Mouse code coverage is also
7e3ed32e 276over 96%. Even the error messages are taken from Moose. The Mouse code just
277runs the test suite 4x faster.
0fff36e6 278
279The idea is that, if you need the extra power, you should be able to run
8e1a28a8 280C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
281nothingmuch has written L<Squirrel> (part of this distribution) which will act
282as Mouse unless Moose is loaded, in which case it will act as Moose.
7ca75105 283L<Any::Moose> is a more high-tech L<Squirrel>.
0fff36e6 284
9090e5fe 285=head2 MouseX
286
287Please don't copy MooseX code to MouseX. If you need extensions, you really
288should upgrade to Moose. We don't need two parallel sets of extensions!
289
290If you really must write a Mouse extension, please contact the Moose mailing
291list or #moose on IRC beforehand.
292
0fff36e6 293=head1 KEYWORDS
c3398f5b 294
306290e8 295=head2 meta -> Mouse::Meta::Class
c3398f5b 296
297Returns this class' metaclass instance.
298
299=head2 extends superclasses
300
301Sets this class' superclasses.
302
b7a74822 303=head2 before (method|methods) => Code
304
305Installs a "before" method modifier. See L<Moose/before> or
306L<Class::Method::Modifiers/before>.
307
6beb7db6 308Use of this feature requires L<Class::Method::Modifiers>!
309
b7a74822 310=head2 after (method|methods) => Code
311
312Installs an "after" method modifier. See L<Moose/after> or
313L<Class::Method::Modifiers/after>.
314
6beb7db6 315Use of this feature requires L<Class::Method::Modifiers>!
316
b7a74822 317=head2 around (method|methods) => Code
318
319Installs an "around" method modifier. See L<Moose/around> or
320L<Class::Method::Modifiers/around>.
321
6beb7db6 322Use of this feature requires L<Class::Method::Modifiers>!
323
c3398f5b 324=head2 has (name|names) => parameters
325
326Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 327this class. Options:
328
329=over 4
330
331=item is => ro|rw
332
333If specified, inlines a read-only/read-write accessor with the same name as
334the attribute.
335
336=item isa => TypeConstraint
337
338Provides basic type checking in the constructor and accessor. Basic types such
339as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
340be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
341objects).
342
343=item required => 0|1
344
345Whether this attribute is required to have a value. If the attribute is lazy or
346has a builder, then providing a value for the attribute in the constructor is
347optional.
348
ca63d17a 349=item init_arg => Str | Undef
0fff36e6 350
ca63d17a 351Allows you to use a different key name in the constructor. If undef, the
352attribue can't be passed to the constructor.
0fff36e6 353
354=item default => Value | CodeRef
355
356Sets the default value of the attribute. If the default is a coderef, it will
357be invoked to get the default value. Due to quirks of Perl, any bare reference
358is forbidden, you must wrap the reference in a coderef. Otherwise, all
359instances will share the same reference.
360
361=item lazy => 0|1
362
363If specified, the default is calculated on demand instead of in the
364constructor.
365
366=item predicate => Str
367
368Lets you specify a method name for installing a predicate method, which checks
369that the attribute has a value. It will not invoke a lazy default or builder
370method.
371
372=item clearer => Str
373
374Lets you specify a method name for installing a clearer method, which clears
375the attribute's value from the instance. On the next read, lazy or builder will
376be invoked.
377
378=item handles => HashRef|ArrayRef
379
380Lets you specify methods to delegate to the attribute. ArrayRef forwards the
381given method names to method calls on the attribute. HashRef maps local method
382names to remote method names called on the attribute. Other forms of
383L</handles>, such as regular expression and coderef, are not yet supported.
384
385=item weak_ref => 0|1
386
387Lets you automatically weaken any reference stored in the attribute.
388
6beb7db6 389Use of this feature requires L<Scalar::Util>!
390
844fa049 391=item trigger => CodeRef
392
393Any 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
6beb7db6 395Mouse 0.05 supported more complex triggers, but this behavior is now removed.
0fff36e6 396
397=item builder => Str
398
399Defines a method name to be called to provide the default value of the
400attribute. C<< builder => 'build_foo' >> is mostly equivalent to
401C<< default => sub { $_[0]->build_foo } >>.
402
403=item auto_deref => 0|1
404
405Allows you to automatically dereference ArrayRef and HashRef attributes in list
406context. In scalar context, the reference is returned (NOT the list length or
407bucket status). You must specify an appropriate type constraint to use
408auto_deref.
409
5253d13d 410=item lazy_build => 0|1
411
412Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
413"clear_$attr', predicate => 'has_$attr' unless they are already defined.
414
0fff36e6 415=back
c3398f5b 416
417=head2 confess error -> BOOM
418
419L<Carp/confess> for your convenience.
420
421=head2 blessed value -> ClassName | undef
422
423L<Scalar::Util/blessed> for your convenience.
424
425=head1 MISC
426
427=head2 import
428
6caea456 429Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 430You may use L</extends> to replace the superclass list.
431
432=head2 unimport
433
0fff36e6 434Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
435keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 436
437=head1 FUNCTIONS
438
439=head2 load_class Class::Name
440
6caea456 441This will load a given C<Class::Name> (or die if it's not loadable).
c3398f5b 442This function can be used in place of tricks like
443C<eval "use $module"> or using C<require>.
444
262801ef 445=head2 is_class_loaded Class::Name -> Bool
446
447Returns whether this class is actually loaded or not. It uses a heuristic which
448involves checking for the existence of C<$VERSION>, C<@ISA>, and any
449locally-defined method.
450
c817e8f1 451=head1 AUTHORS
c3398f5b 452
453Shawn M Moore, C<< <sartak at gmail.com> >>
454
fc9f8988 455Yuval Kogman, C<< <nothingmuch at woobling.org> >>
456
c817e8f1 457tokuhirom
458
459Yappo
460
0fff36e6 461with plenty of code borrowed from L<Class::MOP> and L<Moose>
462
c3398f5b 463=head1 BUGS
464
465No known bugs.
466
467Please report any bugs through RT: email
468C<bug-mouse at rt.cpan.org>, or browse
469L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
470
471=head1 COPYRIGHT AND LICENSE
472
473Copyright 2008 Shawn M Moore.
474
475This program is free software; you can redistribute it and/or modify it
476under the same terms as Perl itself.
477
478=cut
479