Another broken case where Moo::Role, then namespace::autoclean get loaded
[gitmo/Moo.git] / lib / Moo.pm
CommitLineData
b1eebd55 1package Moo;
6c74d087 2
3use strictures 1;
b1eebd55 4use Moo::_Utils;
e0e12d16 5use B 'perlstring';
a41e15c3 6use Sub::Defer ();
6c74d087 7
8cf900ae 8our $VERSION = '0.091003'; # 0.91.3
6d71fae7 9$VERSION = eval $VERSION;
10
c2cb1fed 11require Moo::sification;
8c46a8f6 12
14f32032 13our %MAKERS;
14
6c74d087 15sub import {
16 my $target = caller;
a16d301e 17 my $class = shift;
de3d4906 18 strictures->import;
1ba11455 19 return if $MAKERS{$target}; # already exported into this package
167455a0 20 _install_coderef "${target}::extends" => "Moo::extends" => sub {
fb5074f6 21 _load_module($_) for @_;
786e5ba0 22 # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA
23 @{*{_getglob("${target}::ISA")}{ARRAY}} = @_;
3b0d7efd 24 if (my $old = delete $Moo::MAKERS{$target}{constructor}) {
25 delete _getstash($target)->{new};
26 Moo->_constructor_maker_for($target)
27 ->register_attribute_specs(%{$old->all_attribute_specs});
28 }
6c74d087 29 };
167455a0 30 _install_coderef "${target}::with" => "Moo::with" => sub {
faa9ce11 31 require Moo::Role;
6893ea30 32 Moo::Role->apply_roles_to_package($target, $_[0]);
6c74d087 33 };
a16d301e 34 $MAKERS{$target} = {};
167455a0 35 _install_coderef "${target}::has" => "Moo::has" => sub {
14f32032 36 my ($name, %spec) = @_;
a16d301e 37 $class->_constructor_maker_for($target)
38 ->register_attribute_specs($name, \%spec);
02e9ef74 39 $class->_accessor_maker_for($target)
40 ->generate_method($target, $name, \%spec);
14f32032 41 };
6c74d087 42 foreach my $type (qw(before after around)) {
167455a0 43 _install_coderef "${target}::${type}" => "Moo::${type}" => sub {
faa9ce11 44 require Class::Method::Modifiers;
6c74d087 45 _install_modifier($target, $type, @_);
46 };
47 }
48 {
49 no strict 'refs';
50 @{"${target}::ISA"} = do {
faa9ce11 51 require Moo::Object; ('Moo::Object');
6c74d087 52 } unless @{"${target}::ISA"};
53 }
3362e41c 54 if ($INC{'Moo/HandleMoose.pm'}) {
55 Moo::HandleMoose::inject_fake_metaclass_for($target);
56 }
6c74d087 57}
58
02e9ef74 59sub _accessor_maker_for {
60 my ($class, $target) = @_;
61 return unless $MAKERS{$target};
62 $MAKERS{$target}{accessor} ||= do {
63 my $maker_class = do {
64 if (my $m = do {
65 if (my $defer_target =
66 (Sub::Defer::defer_info($target->can('new'))||[])->[0]
67 ) {
68 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
69 $MAKERS{$pkg} && $MAKERS{$pkg}{accessor};
70 } else {
71 undef;
72 }
73 }) {
74 ref($m);
75 } else {
76 require Method::Generate::Accessor;
77 'Method::Generate::Accessor'
78 }
79 };
80 $maker_class->new;
81 }
82}
83
a16d301e 84sub _constructor_maker_for {
c4570291 85 my ($class, $target, $select_super) = @_;
a16d301e 86 return unless $MAKERS{$target};
87 $MAKERS{$target}{constructor} ||= do {
faa9ce11 88 require Method::Generate::Constructor;
89 require Sub::Defer;
c4570291 90 my ($moo_constructor, $con);
de5c0e53 91
c4570291 92 if ($select_super && $MAKERS{$select_super}) {
93 $moo_constructor = 1;
94 $con = $MAKERS{$select_super}{constructor};
95 } else {
de5c0e53 96 my $t_new = $target->can('new');
c4570291 97 if ($t_new) {
98 if ($t_new == Moo::Object->can('new')) {
99 $moo_constructor = 1;
100 } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) {
101 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
102 if ($MAKERS{$pkg}) {
103 $moo_constructor = 1;
104 $con = $MAKERS{$pkg}{constructor};
105 }
106 }
107 } else {
108 $moo_constructor = 1; # no other constructor, make a Moo one
109 }
de5c0e53 110 };
02e9ef74 111 ($con ? ref($con) : 'Method::Generate::Constructor')
a16d301e 112 ->new(
113 package => $target,
02e9ef74 114 accessor_generator => $class->_accessor_maker_for($target),
53875e2c 115 construction_string => (
116 $moo_constructor
117 ? ($con ? $con->construction_string : undef)
118 : ('$class->'.$target.'::SUPER::new(@_)')
e0e12d16 119 ),
76ab3977 120 subconstructor_handler => (
121 ' if ($Moo::MAKERS{$class}) {'."\n"
122 .' '.$class.'->_constructor_maker_for($class,'.perlstring($target).');'."\n"
123 .' return $class->new(@_)'.";\n"
124 .' }'."\n"
e0e12d16 125 ),
a16d301e 126 )
127 ->install_delayed
de5c0e53 128 ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
a16d301e 129 }
130}
131
6c74d087 1321;
a17be455 133=pod
134
135=encoding utf-8
8146585e 136
505f8b7a 137=head1 NAME
138
139Moo - Minimalist Object Orientation (with Moose compatiblity)
140
8146585e 141=head1 SYNOPSIS
142
143 package Cat::Food;
144
145 use Moo;
146 use Sub::Quote;
147
148 sub feed_lion {
149 my $self = shift;
150 my $amount = shift || 1;
151
152 $self->pounds( $self->pounds - $amount );
153 }
154
155 has taste => (
156 is => 'ro',
157 );
158
159 has brand => (
160 is => 'ro',
161 isa => sub {
162 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
163 },
164);
165
166 has pounds => (
167 is => 'rw',
168 isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
169 );
170
171 1;
172
173and else where
174
175 my $full = Cat::Food->new(
176 taste => 'DELICIOUS.',
177 brand => 'SWEET-TREATZ',
178 pounds => 10,
179 );
180
181 $full->feed_lion;
182
183 say $full->pounds;
184
185=head1 DESCRIPTION
186
187This module is an extremely light-weight, high-performance L<Moose> replacement.
188It also avoids depending on any XS modules to allow simple deployments. The
189name C<Moo> is based on the idea that it provides almost -but not quite- two
190thirds of L<Moose>.
191
192Unlike C<Mouse> this module does not aim at full L<Moose> compatibility. See
193L</INCOMPATIBILITIES> for more details.
194
5d5bb71d 195=head1 WHY MOO EXISTS
196
197If you want a full object system with a rich Metaprotocol, L<Moose> is
198already wonderful.
199
200I've tried several times to use L<Mouse> but it's 3x the size of Moo and
201takes longer to load than most of my Moo based CGI scripts take to run.
202
203If you don't want L<Moose>, you don't want "less metaprotocol" like L<Mouse>,
204you want "as little as possible" - which means "no metaprotocol", which is
205what Moo provides.
206
207By Moo 1.0 I intend to have Moo's equivalent of L<Any::Moose> built in -
208if Moose gets loaded, any Moo class or role will act as a Moose equivalent
209if treated as such.
210
211Hence - Moo exists as its name - Minimal Object Orientation - with a pledge
212to make it smooth to upgrade to L<Moose> when you need more than minimal
213features.
214
1fce5bc9 215=head1 Moo and Moose - NEW, EXPERIMENTAL
216
217If L<Moo> detects L<Moose> being loaded, it will automatically register
218metaclasses for your L<Moo> and L<Moo::Role> packages, so you should be able
219to use them in L<Moose> code without it ever realising you aren't using
220L<Moose> everywhere.
221
222Extending a L<Moose> class or consuming a L<Moose::Role> should also work.
223
660f3db2 224This means that there is no need for anything like L<Any::Moose> for Moo
225code - Moo and Moose code should simply interoperate without problem.
226
227However, these features are new as of 0.91.0 (0.091000) so while serviceable,
228they are absolutely certain to not be 100% yet; please do report bugs.
1fce5bc9 229
230If you need to disable the metaclass creation, add:
231
232 no Moo::sification;
233
234to your code before Moose is loaded, but bear in mind that this switch is
235currently global and turns the mechanism off entirely, so don't put this
236in library code, only in a top level script as a temporary measure while
237you send a bug report.
238
8146585e 239=head1 IMPORTED METHODS
240
241=head2 new
242
243 Foo::Bar->new( attr1 => 3 );
244
245or
246
247 Foo::Bar->new({ attr1 => 3 });
248
2e575bcd 249=head2 BUILDARGS
250
f2eac33e 251 sub BUILDARGS {
a17be455 252 my ( $class, @args ) = @_;
253
254 unshift @args, "attr1" if @args % 2 == 1;
255
f2eac33e 256 return { @args };
a17be455 257 };
258
259 Foo::Bar->new( 3 );
260
261The default implementation of this method accepts a hash or hash reference of
262named parameters. If it receives a single argument that isn't a hash reference
263it throws an error.
264
265You can override this method in your class to handle other types of options
266passed to the constructor.
267
268This method should always return a hash reference of named options.
2e575bcd 269
2d00f3d6 270=head2 BUILD
8146585e 271
2d00f3d6 272Define a C<BUILD> method on your class and the constructor will automatically
273call the C<BUILD> method from parent down to child after the object has
274been instantiated. Typically this is used for object validation or possibly
275logging.
8146585e 276
2d00f3d6 277=head2 DEMOLISH
c2cc003f 278
debb3fcd 279If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
280a C<DESTROY> method is created on first object construction which will call
c2cc003f 281C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 282method from child upwards to parents.
283
284Note that the C<DESTROY> method is created on first construction of an object
285of your class in order to not add overhead to classes without C<DEMOLISH>
286methods; this may prove slightly surprising if you try and define your own.
c2cc003f 287
8146585e 288=head2 does
289
290 if ($foo->does('Some::Role1')) {
291 ...
292 }
293
294Returns true if the object composes in the passed role.
295
296=head1 IMPORTED SUBROUTINES
297
298=head2 extends
299
300 extends 'Parent::Class';
301
2e575bcd 302Declares base class. Multiple superclasses can be passed for multiple
303inheritance (but please use roles instead).
304
305Calling extends more than once will REPLACE your superclasses, not add to
306them like 'use base' would.
8146585e 307
308=head2 with
309
310 with 'Some::Role1';
8146585e 311
f9755246 312or
313
314 with 'Some::Role1', 'Some::Role2';
315
316Composes one or more L<Moo::Role> (or L<Role::Tiny>) roles into the current
317class. An error will be raised if these roles have conflicting methods.
8146585e 318
319=head2 has
320
321 has attr => (
322 is => 'ro',
323 );
324
325Declares an attribute for the class.
326
327The options for C<has> are as follows:
328
329=over 2
330
331=item * is
332
71db76ce 333B<required>, may be C<ro>, C<rw>, C<lazy> or C<rwp>.
334
335C<ro> generates an accessor that dies if you attempt to write to it - i.e.
336a getter only - by defaulting C<reader> to the name of the attribute.
337
338C<rw> generates a normal getter/setter by defauting C<accessor> to the
339name of the attribute.
340
341C<lazy> generates a reader like C<ro>, but also sets C<lazy> to 1 and
342C<builder> to C<_build_${attribute_name}> to allow on-demand generated
343attributes. This feature was my attempt to fix my incompetence when
344originally designing C<lazy_build>, and is also implemented by
345L<MooseX::AttributeShortcuts>.
346
347C<rwp> generates a reader like C<ro>, but also sets C<writer> to
348C<_set_${attribute_name}> for attributes that are designed to be written
349from inside of the class, but read-only from outside.
350This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 351
352=item * isa
353
354Takes a coderef which is meant to validate the attribute. Unlike L<Moose> Moo
355does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
356one should do
357
358 isa => quote_sub q{
359 die "$_[0] is not a number!" unless looks_like_number $_[0]
360 },
361
362L<Sub::Quote aware|/SUB QUOTE AWARE>
363
71db76ce 364If you want L<MooseX::Types> style named types, look at
365L<MooX::Types::MooseLike>.
366
367To cause your C<isa> entries to be automatically mapped to named
368L<Moose::Meta::TypeConstraint> objects (rather than the default behaviour
369of creating an anonymous type), set:
370
371 $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub {
372 require MooseX::Types::Something;
373 return MooseX::Types::Something::TypeName();
374 };
375
376Note that this example is purely illustrative; anything that returns a
377L<Moose::Meta::TypeConstraint> object or something similar enough to it to
378make L<Moose> happy is fine.
379
8146585e 380=item * coerce
381
382Takes a coderef which is meant to coerce the attribute. The basic idea is to
383do something like the following:
384
385 coerce => quote_sub q{
386 $_[0] + 1 unless $_[0] % 2
387 },
388
71db76ce 389Coerce does not require C<isa> to be defined, but since L<Moose> does
390require it, the metaclass inflation for coerce-alone is a trifle insane
391and if you attempt to subtype the result will almost certainly break.
8146585e 392
23a3e34e 393L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 394
e1efec09 395=item * handles
396
397Takes a string
398
69673ca7 399 handles => 'RobotRole'
400
401Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
402becomes the list of methods to handle.
e1efec09 403
404Takes a list of methods
405
406 handles => [ qw( one two ) ]
407
408Takes a hashref
409
410 handles => {
411 un => 'one',
412 }
413
8146585e 414=item * trigger
415
6fe5100d 416Takes a coderef which will get called any time the attribute is set. This
417includes the constructor. Coderef will be invoked against the object with the
418new value as an argument.
8146585e 419
71db76ce 420If you set this to just C<1>, it generates a trigger which calls the
421C<_trigger_${attr_name}> method on C<$self>. This feature comes from
422L<MooseX::AttributeShortcuts>.
423
2e575bcd 424Note that Moose also passes the old value, if any; this feature is not yet
425supported.
426
8146585e 427L<Sub::Quote aware|/SUB QUOTE AWARE>
428
429=item * default
430
2e575bcd 431Takes a coderef which will get called with $self as its only argument
432to populate an attribute if no value is supplied to the constructor - or
433if the attribute is lazy, when the attribute is first retrieved if no
434value has yet been provided.
435
436Note that if your default is fired during new() there is no guarantee that
437other attributes have been populated yet so you should not rely on their
438existence.
8146585e 439
440L<Sub::Quote aware|/SUB QUOTE AWARE>
441
442=item * predicate
443
2e575bcd 444Takes a method name which will return true if an attribute has a value.
8146585e 445
71db76ce 446If you set this to just C<1>, the predicate is automatically named
447C<has_${attr_name}> if your attribute's name does not start with an
448underscore, or <_has_${attr_name_without_the_underscore}> if it does.
449This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 450
451=item * builder
452
2e575bcd 453Takes a method name which will be called to create the attribute - functions
454exactly like default except that instead of calling
455
456 $default->($self);
457
458Moo will call
459
460 $self->$builder;
8146585e 461
71db76ce 462If you set this to just C<1>, the predicate is automatically named
463C<_build_${attr_name}>. This feature comes from L<MooseX::AttributeShortcuts>.
464
8146585e 465=item * clearer
466
467Takes a method name which will clear the attribute.
468
71db76ce 469If you set this to just C<1>, the clearer is automatically named
470C<clear_${attr_name}> if your attribute's name does not start with an
471underscore, or <_clear_${attr_name_without_the_underscore}> if it does.
472This feature comes from L<MooseX::AttributeShortcuts>.
473
8146585e 474=item * lazy
475
476B<Boolean>. Set this if you want values for the attribute to be grabbed
477lazily. This is usually a good idea if you have a L</builder> which requires
478another attribute to be set.
479
480=item * required
481
482B<Boolean>. Set this if the attribute must be passed on instantiation.
483
1eba910c 484=item * reader
485
486The value of this attribute will be the name of the method to get the value of
487the attribute. If you like Java style methods, you might set this to
488C<get_foo>
489
490=item * writer
491
492The value of this attribute will be the name of the method to set the value of
493the attribute. If you like Java style methods, you might set this to
494C<set_foo>
495
8146585e 496=item * weak_ref
497
498B<Boolean>. Set this if you want the reference that the attribute contains to
499be weakened; use this when circular references are possible, which will cause
500leaks.
501
502=item * init_arg
503
504Takes the name of the key to look for at instantiation time of the object. A
505common use of this is to make an underscored attribute have a non-underscored
506initialization name. C<undef> means that passing the value in on instantiation
71db76ce 507is ignored.
8146585e 508
509=back
510
511=head2 before
512
513 before foo => sub { ... };
514
515See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
516documentation.
517
518=head2 around
519
520 around foo => sub { ... };
521
522See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
523documentation.
524
525=head2 after
526
527 after foo => sub { ... };
528
529See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
530documentation.
531
8146585e 532=head1 SUB QUOTE AWARE
533
534L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
535giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
536aware can take advantage of this.
537
2e575bcd 538=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 539
5902c1fc 540There is no built in type system. C<isa> is verified with a coderef, if you
8146585e 541need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 542that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
543to L<MooseX::Types::Moose> so that you can write
544
545 has days_to_live => (is => 'ro', isa => Int);
546
547and have it work with both; it is hoped that providing only subrefs as an
548API will encourage the use of other type systems as well, since it's
549probably the weakest part of Moose design-wise.
8146585e 550
2e575bcd 551C<initializer> is not supported in core since the author considers it to be a
f88623a1 552bad idea but may be supported by an extension in future. Meanwhile C<trigger> or
553C<coerce> are more likely to be able to fulfill your needs.
8146585e 554
555There is no meta object. If you need this level of complexity you wanted
2e575bcd 556L<Moose> - Moo succeeds at being small because it explicitly does not
f9755246 557provide a metaprotocol. However, if you load L<Moose>, then
558
559 Class::MOP::class_of($moo_class_or_role)
560
561will return an appropriate metaclass pre-populated by L<Moo>.
8146585e 562
2e575bcd 563No support for C<super>, C<override>, C<inner>, or C<augment> - override can
564be handled by around albeit with a little more typing, and the author considers
565augment to be a bad idea.
8146585e 566
f2eac33e 567The C<dump> method is not provided by default. The author suggests loading
c96a6326 568L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
569using C<$obj-E<gt>$::Dwarn()> instead.
570
8146585e 571L</default> only supports coderefs, because doing otherwise is usually a
572mistake anyway.
573
f9755246 574C<lazy_build> is not supported; you are instead encouraged to use the
575C<is => 'lazy'> option supported by L<Moo> and L<MooseX::AttributeShortcuts>.
8146585e 576
2e575bcd 577C<auto_deref> is not supported since the author considers it a bad idea.
8146585e 578
f9755246 579C<documentation> will show up in a L<Moose> metaclass created from your class
580but is otherwise ignored. Then again, L<Moose> ignors it as well, so this
581is arguably not an incompatibility.
40f3e3aa 582
69673ca7 583Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
584similar invocation for L<Moose> would be:
585
586 use Moose;
587 use warnings FATAL => "all";
588
589Additionally, L<Moo> supports a set of attribute option shortcuts intended to
590reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 591module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 592
593 package MyClass;
594 use Moo;
595
596The nearest L<Moose> invocation would be:
597
598 package MyClass;
599
600 use Moose;
601 use warnings FATAL => "all";
602 use MooseX::AttributeShortcuts;
603
5902c1fc 604or, if you're inheriting from a non-Moose class,
605
606 package MyClass;
607
608 use Moose;
609 use MooseX::NonMoose;
610 use warnings FATAL => "all";
611 use MooseX::AttributeShortcuts;
612
613Finally, Moose requires you to call
614
615 __PACKAGE__->meta->make_immutable;
616
617at the end of your class to get an inlined (i.e. not horribly slow)
618constructor. Moo does it automatically the first time ->new is called
619on your class.
620
660f3db2 621=head1 SUPPORT
622
623IRC: #web-simple on irc.perl.org
624
40f3e3aa 625=head1 AUTHOR
626
627mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
628
629=head1 CONTRIBUTORS
630
5da684a2 631dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
632
633frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
634
635hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
636
637jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
638
639ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 640
11f7a042 641chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
642
a17be455 643ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
644
7b8177f8 645doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
646
1fb2de92 647perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
648
40f3e3aa 649=head1 COPYRIGHT
650
a958e36d 651Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 652as listed above.
653
654=head1 LICENSE
655
656This library is free software and may be distributed under the same terms
657as perl itself.
658
659=cut