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