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