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