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