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