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