Changelogging
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1package Mouse;
2use strict;
3use warnings;
eae80759 4use 5.006;
eaad7dab 5use base 'Exporter';
c3398f5b 6
2ba7f7cd 7our $VERSION = '0.32';
c3398f5b 8
bf9f3f91 9sub moose_version(){ 0.90 } # which Mouse is a subset of
10
c3398f5b 11use Carp 'confess';
6c169c50 12use Scalar::Util 'blessed';
6d28c5cf 13
6cfa1e5e 14use Mouse::Util qw(load_class is_class_loaded);
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
e6007308 23our @EXPORT = qw(extends has before after around override super blessed confess with);
eaad7dab 24
3a63a2e7 25our %is_removable = map{ $_ => undef } @EXPORT;
26delete $is_removable{blessed};
27delete $is_removable{confess};
28
8bc2760b 29sub extends { Mouse::Meta::Class->initialize(scalar caller)->superclasses(@_) }
c3398f5b 30
eaad7dab 31sub has {
8bc2760b 32 my $meta = Mouse::Meta::Class->initialize(scalar caller);
60f6eba9 33 $meta->add_attribute(@_);
eaad7dab 34}
35
36sub before {
8bc2760b 37 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 38
39 my $code = pop;
40
41 for (@_) {
42 $meta->add_before_method_modifier($_ => $code);
43 }
44}
45
46sub after {
8bc2760b 47 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 48
49 my $code = pop;
50
51 for (@_) {
52 $meta->add_after_method_modifier($_ => $code);
53 }
54}
55
56sub around {
8bc2760b 57 my $meta = Mouse::Meta::Class->initialize(scalar caller);
eaad7dab 58
59 my $code = pop;
60
61 for (@_) {
62 $meta->add_around_method_modifier($_ => $code);
63 }
64}
65
66sub with {
8bc2760b 67 Mouse::Util::apply_all_roles(scalar(caller), @_);
eaad7dab 68}
69
e6007308 70our $SUPER_PACKAGE;
71our $SUPER_BODY;
72our @SUPER_ARGS;
73
74sub super {
75 # This check avoids a recursion loop - see
76 # t/100_bugs/020_super_recursion.t
77 return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller();
78 return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS);
79}
80
81sub override {
82 my $meta = Mouse::Meta::Class->initialize(caller);
83 my $pkg = $meta->name;
84
85 my $name = shift;
86 my $code = shift;
87
88 my $body = $pkg->can($name)
89 or confess "You cannot override '$name' because it has no super method";
90
91 $meta->add_method($name => sub {
92 local $SUPER_PACKAGE = $pkg;
93 local @SUPER_ARGS = @_;
94 local $SUPER_BODY = $body;
95
96 $code->(@_);
97 });
98}
99
0d6e12be 100sub init_meta {
0d6e12be 101 shift;
102 my %args = @_;
103
104 my $class = $args{for_class}
382b7340 105 or confess("Cannot call init_meta without specifying a for_class");
0d6e12be 106 my $base_class = $args{base_class} || 'Mouse::Object';
107 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
108
382b7340 109 confess("The Metaclass $metaclass must be a subclass of Mouse::Meta::Class.")
0d6e12be 110 unless $metaclass->isa('Mouse::Meta::Class');
382b7340 111
0d6e12be 112 # make a subtype for each Mouse class
6d28c5cf 113 Mouse::Util::TypeConstraints::class_type($class)
114 unless Mouse::Util::TypeConstraints::find_type_constraint($class);
0d6e12be 115
116 my $meta = $metaclass->initialize($class);
0d6e12be 117
3a63a2e7 118 $meta->add_method(meta => sub{
382b7340 119 return $metaclass->initialize(ref($_[0]) || $_[0]);
3a63a2e7 120 });
121
382b7340 122 $meta->superclasses($base_class)
123 unless $meta->superclasses;
0d6e12be 124
125 return $meta;
126}
127
eaad7dab 128sub import {
e15d73d2 129 my $class = shift;
130
eaad7dab 131 strict->import;
132 warnings->import;
133
bfcc8a05 134 my $opts = do {
135 if (ref($_[0]) && ref($_[0]) eq 'HASH') {
136 shift @_;
137 } else {
138 +{ };
139 }
140 };
141 my $level = delete $opts->{into_level};
142 $level = 0 unless defined $level;
143 my $caller = caller($level);
eaad7dab 144
7daedfff 145 # we should never export to main
146 if ($caller eq 'main') {
147 warn qq{$class does not export its sugar to the 'main' package.\n};
148 return;
149 }
150
382b7340 151 $class->init_meta(
0d6e12be 152 for_class => $caller,
153 );
eaad7dab 154
e15d73d2 155 if (@_) {
bfcc8a05 156 __PACKAGE__->export_to_level( $level+1, $class, @_);
e15d73d2 157 } else {
158 # shortcut for the common case of no type character
159 no strict 'refs';
160 for my $keyword (@EXPORT) {
161 *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
162 }
163 }
eaad7dab 164}
165
166sub unimport {
167 my $caller = caller;
168
3a63a2e7 169 my $stash = do{
170 no strict 'refs';
171 \%{$caller . '::'}
172 };
173
eaad7dab 174 for my $keyword (@EXPORT) {
3a63a2e7 175 my $code;
176 if(exists $is_removable{$keyword}
177 && ($code = $caller->can($keyword))
178 && (Mouse::Util::get_code_info($code))[0] eq __PACKAGE__){
179
180 delete $stash->{$keyword};
181 }
eaad7dab 182 }
183}
c3398f5b 184
c3398f5b 1851;
186
187__END__
188
189=head1 NAME
190
0fff36e6 191Mouse - Moose minus the antlers
c3398f5b 192
c3398f5b 193=head1 SYNOPSIS
194
195 package Point;
6caea456 196 use Mouse; # automatically turns on strict and warnings
197
198 has 'x' => (is => 'rw', isa => 'Int');
199 has 'y' => (is => 'rw', isa => 'Int');
200
201 sub clear {
202 my $self = shift;
203 $self->x(0);
204 $self->y(0);
205 }
206
207 package Point3D;
c3398f5b 208 use Mouse;
209
6caea456 210 extends 'Point';
c3398f5b 211
6caea456 212 has 'z' => (is => 'rw', isa => 'Int');
213
8517d2ff 214 after 'clear' => sub {
215 my $self = shift;
216 $self->z(0);
217 };
c3398f5b 218
219=head1 DESCRIPTION
220
6614c108 221L<Moose> is wonderful. B<Use Moose instead of Mouse.>
c3398f5b 222
16913e71 223Unfortunately, Moose has a compile-time penalty. Though significant progress
224has been made over the years, the compile time penalty is a non-starter for
225some very specific applications. If you are writing a command-line application
226or CGI script where startup time is essential, you may not be able to use
227Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
228latter, if possible.
0fff36e6 229
6614c108 230Mouse aims to alleviate this by providing a subset of Moose's functionality,
231faster.
0fff36e6 232
7ca75105 233We're also going as light on dependencies as possible.
3fcf8a33 234L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
235if you want support for L</before>, L</after>, and L</around>.
d1c1b994 236
0fff36e6 237=head2 MOOSE COMPAT
238
239Compatibility with Moose has been the utmost concern. Fewer than 1% of the
240tests fail when run against Moose instead of Mouse. Mouse code coverage is also
7e3ed32e 241over 96%. Even the error messages are taken from Moose. The Mouse code just
242runs the test suite 4x faster.
0fff36e6 243
244The idea is that, if you need the extra power, you should be able to run
8e1a28a8 245C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
6614c108 246we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
16913e71 247in which case it will act as Moose. Since Mouse is a little sloppier than
248Moose, if you run into weird errors, it would be worth running:
249
250 ANY_MOOSE=Moose perl your-script.pl
251
252to see if the bug is caused by Mouse. Moose's diagnostics and validation are
253also much better.
0fff36e6 254
9090e5fe 255=head2 MouseX
256
257Please don't copy MooseX code to MouseX. If you need extensions, you really
258should upgrade to Moose. We don't need two parallel sets of extensions!
259
260If you really must write a Mouse extension, please contact the Moose mailing
261list or #moose on IRC beforehand.
262
56be135d 263=head2 Maintenance
264
265The original author of this module has mostly stepped down from maintaining
266Mouse. See L<http://www.nntp.perl.org/group/perl.moose/2009/04/msg653.html>.
267If you would like to help maintain this module, please get in touch with us.
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
ba55dea1 451Goro Fuji (gfx) C<< <gfuji at cpan.org> >>
452
0fff36e6 453with plenty of code borrowed from L<Class::MOP> and L<Moose>
454
c3398f5b 455=head1 BUGS
456
9e3c345e 457There is a known issue with Mouse on 5.6.2 regarding the @ISA tests. Until
458this is resolve the minimum version of Perl for Mouse is set to 5.8.0. Patches
459to resolve these tests are more than welcome.
c3398f5b 460
461Please report any bugs through RT: email
462C<bug-mouse at rt.cpan.org>, or browse
463L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
464
465=head1 COPYRIGHT AND LICENSE
466
3ef6ae56 467Copyright 2008-2009 Infinity Interactive, Inc.
468
469http://www.iinteractive.com/
c3398f5b 470
471This program is free software; you can redistribute it and/or modify it
472under the same terms as Perl itself.
473
474=cut
475