squash, cleanup on _validate_codulatable
[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
b35f7bd5 8our $VERSION = '1.001000'; # 1.1.0
6d71fae7 9$VERSION = eval $VERSION;
10
c2cb1fed 11require Moo::sification;
8c46a8f6 12
14f32032 13our %MAKERS;
14
108f8ddc 15sub _install_tracked {
16 my ($target, $name, $code) = @_;
17 $MAKERS{$target}{exports}{$name} = $code;
18 _install_coderef "${target}::${name}" => "Moo::${name}" => $code;
19}
20
6c74d087 21sub import {
22 my $target = caller;
a16d301e 23 my $class = shift;
de3d4906 24 strictures->import;
1791ba32 25 if ($Moo::Role::INFO{$target} and $Moo::Role::INFO{$target}{is_role}) {
26 die "Cannot import Moo into a role";
27 }
fa93bfb2 28 $MAKERS{$target} ||= {};
108f8ddc 29 _install_tracked $target => extends => sub {
48a51428 30 $class->_set_superclasses($target, @_);
6c49212f 31 $class->_maybe_reset_handlemoose($target);
3d49ee27 32 return;
6c74d087 33 };
108f8ddc 34 _install_tracked $target => with => sub {
faa9ce11 35 require Moo::Role;
6067158c 36 Moo::Role->apply_roles_to_package($target, @_);
6c49212f 37 $class->_maybe_reset_handlemoose($target);
6c74d087 38 };
108f8ddc 39 _install_tracked $target => has => sub {
1d17c7c1 40 my ($name_proto, %spec) = @_;
41 my $name_isref = ref $name_proto eq 'ARRAY';
42 foreach my $name ($name_isref ? @$name_proto : $name_proto) {
43 # Note that when $name_proto is an arrayref, each attribute
44 # needs a separate \%specs hashref
45 my $spec_ref = $name_isref ? +{%spec} : \%spec;
46 $class->_constructor_maker_for($target)
47 ->register_attribute_specs($name, $spec_ref);
48 $class->_accessor_maker_for($target)
49 ->generate_method($target, $name, $spec_ref);
50 $class->_maybe_reset_handlemoose($target);
51 }
3d49ee27 52 return;
14f32032 53 };
6c74d087 54 foreach my $type (qw(before after around)) {
108f8ddc 55 _install_tracked $target => $type => sub {
faa9ce11 56 require Class::Method::Modifiers;
6c74d087 57 _install_modifier($target, $type, @_);
3d49ee27 58 return;
6c74d087 59 };
60 }
fa93bfb2 61 return if $MAKERS{$target}{is_class}; # already exported into this package
62 $MAKERS{$target}{is_class} = 1;
6c74d087 63 {
64 no strict 'refs';
65 @{"${target}::ISA"} = do {
faa9ce11 66 require Moo::Object; ('Moo::Object');
6c74d087 67 } unless @{"${target}::ISA"};
68 }
3362e41c 69 if ($INC{'Moo/HandleMoose.pm'}) {
70 Moo::HandleMoose::inject_fake_metaclass_for($target);
71 }
6c74d087 72}
73
108f8ddc 74sub unimport {
75 my $target = caller;
76 _unimport_coderefs($target, $MAKERS{$target});
77}
78
48a51428 79sub _set_superclasses {
88aaa04a 80 my $class = shift;
81 my $target = shift;
141b507a 82 foreach my $superclass (@_) {
83 _load_module($superclass);
84 if ($INC{"Role/Tiny.pm"} && $Role::Tiny::INFO{$superclass}) {
88aaa04a 85 require Carp;
141b507a 86 Carp::croak("Can't extend role '$superclass'");
48a51428 87 }
88aaa04a 88 }
89 # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA
90 @{*{_getglob("${target}::ISA")}{ARRAY}} = @_;
91 if (my $old = delete $Moo::MAKERS{$target}{constructor}) {
92 delete _getstash($target)->{new};
93 Moo->_constructor_maker_for($target)
94 ->register_attribute_specs(%{$old->all_attribute_specs});
95 }
96 no warnings 'once'; # piss off. -- mst
97 $Moo::HandleMoose::MOUSE{$target} = [
98 grep defined, map Mouse::Util::find_meta($_), @_
96b09f21 99 ] if Mouse::Util->can('find_meta');
48a51428 100}
101
6c49212f 102sub _maybe_reset_handlemoose {
103 my ($class, $target) = @_;
104 if ($INC{"Moo/HandleMoose.pm"}) {
105 Moo::HandleMoose::maybe_reinject_fake_metaclass_for($target);
106 }
107}
108
02e9ef74 109sub _accessor_maker_for {
110 my ($class, $target) = @_;
111 return unless $MAKERS{$target};
112 $MAKERS{$target}{accessor} ||= do {
113 my $maker_class = do {
114 if (my $m = do {
115 if (my $defer_target =
116 (Sub::Defer::defer_info($target->can('new'))||[])->[0]
117 ) {
118 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
119 $MAKERS{$pkg} && $MAKERS{$pkg}{accessor};
120 } else {
121 undef;
122 }
123 }) {
124 ref($m);
125 } else {
126 require Method::Generate::Accessor;
127 'Method::Generate::Accessor'
128 }
129 };
130 $maker_class->new;
131 }
132}
133
a16d301e 134sub _constructor_maker_for {
c4570291 135 my ($class, $target, $select_super) = @_;
a16d301e 136 return unless $MAKERS{$target};
137 $MAKERS{$target}{constructor} ||= do {
faa9ce11 138 require Method::Generate::Constructor;
139 require Sub::Defer;
c4570291 140 my ($moo_constructor, $con);
de5c0e53 141
c4570291 142 if ($select_super && $MAKERS{$select_super}) {
143 $moo_constructor = 1;
144 $con = $MAKERS{$select_super}{constructor};
145 } else {
de5c0e53 146 my $t_new = $target->can('new');
c4570291 147 if ($t_new) {
148 if ($t_new == Moo::Object->can('new')) {
149 $moo_constructor = 1;
150 } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) {
151 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
152 if ($MAKERS{$pkg}) {
153 $moo_constructor = 1;
154 $con = $MAKERS{$pkg}{constructor};
155 }
156 }
157 } else {
158 $moo_constructor = 1; # no other constructor, make a Moo one
159 }
de5c0e53 160 };
02e9ef74 161 ($con ? ref($con) : 'Method::Generate::Constructor')
a16d301e 162 ->new(
163 package => $target,
02e9ef74 164 accessor_generator => $class->_accessor_maker_for($target),
53875e2c 165 construction_string => (
166 $moo_constructor
167 ? ($con ? $con->construction_string : undef)
e963cc96 168 : ('$class->'.$target.'::SUPER::new($class->can(q[FOREIGNBUILDARGS]) ? $class->FOREIGNBUILDARGS(@_) : @_)')
e0e12d16 169 ),
76ab3977 170 subconstructor_handler => (
171 ' if ($Moo::MAKERS{$class}) {'."\n"
172 .' '.$class.'->_constructor_maker_for($class,'.perlstring($target).');'."\n"
173 .' return $class->new(@_)'.";\n"
346177ba 174 .' } elsif ($INC{"Moose.pm"} and my $meta = Class::MOP::get_metaclass_by_name($class)) {'."\n"
eea41fb2 175 .' return $meta->new_object($class->BUILDARGS(@_));'."\n"
76ab3977 176 .' }'."\n"
e0e12d16 177 ),
a16d301e 178 )
179 ->install_delayed
de5c0e53 180 ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
a16d301e 181 }
182}
183
6c74d087 1841;
a17be455 185=pod
186
187=encoding utf-8
8146585e 188
505f8b7a 189=head1 NAME
190
c1c6bd6d 191Moo - Minimalist Object Orientation (with Moose compatibility)
505f8b7a 192
8146585e 193=head1 SYNOPSIS
194
195 package Cat::Food;
196
197 use Moo;
8146585e 198
199 sub feed_lion {
200 my $self = shift;
201 my $amount = shift || 1;
202
203 $self->pounds( $self->pounds - $amount );
204 }
205
206 has taste => (
207 is => 'ro',
208 );
209
210 has brand => (
211 is => 'ro',
212 isa => sub {
213 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
214 },
16382e05 215 );
8146585e 216
217 has pounds => (
218 is => 'rw',
c9f73a63 219 isa => sub { die "$_[0] is too much cat food!" unless $_[0] < 15 },
8146585e 220 );
221
222 1;
223
52e8f144 224And elsewhere:
8146585e 225
226 my $full = Cat::Food->new(
227 taste => 'DELICIOUS.',
228 brand => 'SWEET-TREATZ',
229 pounds => 10,
230 );
231
232 $full->feed_lion;
233
234 say $full->pounds;
235
236=head1 DESCRIPTION
237
71bd6a81 238This module is an extremely light-weight subset of L<Moose> optimised for
52e8f144 239rapid startup and "pay only for what you use".
71bd6a81 240
8146585e 241It also avoids depending on any XS modules to allow simple deployments. The
52e8f144 242name C<Moo> is based on the idea that it provides almost -- but not quite -- two
8146585e 243thirds of L<Moose>.
244
52e8f144 245Unlike L<Mouse> this module does not aim at full compatibility with
71bd6a81 246L<Moose>'s surface syntax, preferring instead of provide full interoperability
5f0ba39b 247via the metaclass inflation capabilities described in L</MOO AND MOOSE>.
71bd6a81 248
249For a full list of the minor differences between L<Moose> and L<Moo>'s surface
21717718 250syntax, see L</INCOMPATIBILITIES WITH MOOSE>.
8146585e 251
5d5bb71d 252=head1 WHY MOO EXISTS
253
254If you want a full object system with a rich Metaprotocol, L<Moose> is
255already wonderful.
256
71bd6a81 257However, sometimes you're writing a command line script or a CGI script
258where fast startup is essential, or code designed to be deployed as a single
259file via L<App::FatPacker>, or you're writing a CPAN module and you want it
260to be usable by people with those constraints.
261
5d5bb71d 262I've tried several times to use L<Mouse> but it's 3x the size of Moo and
263takes longer to load than most of my Moo based CGI scripts take to run.
264
265If you don't want L<Moose>, you don't want "less metaprotocol" like L<Mouse>,
52e8f144 266you want "as little as possible" -- which means "no metaprotocol", which is
5d5bb71d 267what Moo provides.
268
71bd6a81 269Better still, if you install and load L<Moose>, we set up metaclasses for your
270L<Moo> classes and L<Moo::Role> roles, so you can use them in L<Moose> code
271without ever noticing that some of your codebase is using L<Moo>.
5d5bb71d 272
52e8f144 273Hence, Moo exists as its name -- Minimal Object Orientation -- with a pledge
5d5bb71d 274to make it smooth to upgrade to L<Moose> when you need more than minimal
275features.
276
71bd6a81 277=head1 MOO AND MOOSE
1fce5bc9 278
279If L<Moo> detects L<Moose> being loaded, it will automatically register
280metaclasses for your L<Moo> and L<Moo::Role> packages, so you should be able
a297a9ab 281to use them in L<Moose> code without anybody ever noticing you aren't using
1fce5bc9 282L<Moose> everywhere.
283
9a3fc505 284L<Moo> will also create L<Moose type constraints|Moose::Manual::Types> for
285classes and roles, so that C<< isa => 'MyClass' >> and C<< isa => 'MyRole' >>
286work the same as for L<Moose> classes and roles.
287
a297a9ab 288Extending a L<Moose> class or consuming a L<Moose::Role> will also work.
1fce5bc9 289
a297a9ab 290So will extending a L<Mouse> class or consuming a L<Mouse::Role> - but note
291that we don't provide L<Mouse> metaclasses or metaroles so the other way
292around doesn't work. This feature exists for L<Any::Moose> users porting to
52e8f144 293L<Moo>; enabling L<Mouse> users to use L<Moo> classes is not a priority for us.
c100c04c 294
660f3db2 295This means that there is no need for anything like L<Any::Moose> for Moo
c100c04c 296code - Moo and Moose code should simply interoperate without problem. To
297handle L<Mouse> code, you'll likely need an empty Moo role or class consuming
298or extending the L<Mouse> stuff since it doesn't register true L<Moose>
71bd6a81 299metaclasses like L<Moo> does.
300
301If you want types to be upgraded to the L<Moose> types, use
302L<MooX::Types::MooseLike> and install the L<MooseX::Types> library to
303match the L<MooX::Types::MooseLike> library you're using - L<Moo> will
304load the L<MooseX::Types> library and use that type for the newly created
305metaclass.
660f3db2 306
1fce5bc9 307If you need to disable the metaclass creation, add:
308
309 no Moo::sification;
310
311to your code before Moose is loaded, but bear in mind that this switch is
a297a9ab 312currently global and turns the mechanism off entirely so don't put this
313in library code.
1fce5bc9 314
c687d016 315=head1 MOO VERSUS ANY::MOOSE
316
317L<Any::Moose> will load L<Mouse> normally, and L<Moose> in a program using
318L<Moose> - which theoretically allows you to get the startup time of L<Mouse>
319without disadvantaging L<Moose> users.
320
321Sadly, this doesn't entirely work, since the selection is load order dependent
322- L<Moo>'s metaclass inflation system explained above in L</MOO AND MOOSE> is
323significantly more reliable.
324
325So if you want to write a CPAN module that loads fast or has only pure perl
326dependencies but is also fully usable by L<Moose> users, you should be using
327L<Moo>.
328
329For a full explanation, see the article
330L<http://shadow.cat/blog/matt-s-trout/moo-versus-any-moose> which explains
331the differing strategies in more detail and provides a direct example of
332where L<Moo> succeeds and L<Any::Moose> fails.
333
8146585e 334=head1 IMPORTED METHODS
335
336=head2 new
337
338 Foo::Bar->new( attr1 => 3 );
339
340or
341
342 Foo::Bar->new({ attr1 => 3 });
343
2e575bcd 344=head2 BUILDARGS
345
f2eac33e 346 sub BUILDARGS {
a17be455 347 my ( $class, @args ) = @_;
348
349 unshift @args, "attr1" if @args % 2 == 1;
350
f2eac33e 351 return { @args };
a17be455 352 };
353
354 Foo::Bar->new( 3 );
355
356The default implementation of this method accepts a hash or hash reference of
357named parameters. If it receives a single argument that isn't a hash reference
358it throws an error.
359
360You can override this method in your class to handle other types of options
361passed to the constructor.
362
363This method should always return a hash reference of named options.
2e575bcd 364
76a0beff 365=head2 FOREIGNBUILDARGS
366
367If you are inheriting from a non-Moo class, the arguments passed to the parent
368class constructor can be manipulated by defining a C<FOREIGNBUILDARGS> method.
369It will recieve the same arguments as C<BUILDARGS>, and should return a list
370of arguments to pass to the parent class constructor.
371
2d00f3d6 372=head2 BUILD
8146585e 373
2d00f3d6 374Define a C<BUILD> method on your class and the constructor will automatically
375call the C<BUILD> method from parent down to child after the object has
376been instantiated. Typically this is used for object validation or possibly
377logging.
8146585e 378
2d00f3d6 379=head2 DEMOLISH
c2cc003f 380
debb3fcd 381If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
382a C<DESTROY> method is created on first object construction which will call
c2cc003f 383C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 384method from child upwards to parents.
385
386Note that the C<DESTROY> method is created on first construction of an object
387of your class in order to not add overhead to classes without C<DEMOLISH>
388methods; this may prove slightly surprising if you try and define your own.
c2cc003f 389
8146585e 390=head2 does
391
392 if ($foo->does('Some::Role1')) {
393 ...
394 }
395
396Returns true if the object composes in the passed role.
397
398=head1 IMPORTED SUBROUTINES
399
400=head2 extends
401
402 extends 'Parent::Class';
403
2e575bcd 404Declares base class. Multiple superclasses can be passed for multiple
405inheritance (but please use roles instead).
406
407Calling extends more than once will REPLACE your superclasses, not add to
408them like 'use base' would.
8146585e 409
410=head2 with
411
412 with 'Some::Role1';
8146585e 413
f9755246 414or
415
416 with 'Some::Role1', 'Some::Role2';
417
418Composes one or more L<Moo::Role> (or L<Role::Tiny>) roles into the current
419class. An error will be raised if these roles have conflicting methods.
8146585e 420
421=head2 has
422
423 has attr => (
424 is => 'ro',
425 );
426
427Declares an attribute for the class.
428
1c9916fa 429 package Foo;
430 use Moo;
431 has 'attr' => (
432 is => 'ro'
433 );
d56136b9 434
1c9916fa 435 package Bar;
436 use Moo;
437 extends 'Foo';
d56136b9 438 has '+attr' => (
439 default => sub { "blah" },
440 );
441
442Using the C<+> notation, it's possible to override an attribute.
443
8146585e 444The options for C<has> are as follows:
445
446=over 2
447
448=item * is
449
6577509a 450B<required>, may be C<ro>, C<lazy>, C<rwp> or C<rw>.
71db76ce 451
452C<ro> generates an accessor that dies if you attempt to write to it - i.e.
453a getter only - by defaulting C<reader> to the name of the attribute.
454
71db76ce 455C<lazy> generates a reader like C<ro>, but also sets C<lazy> to 1 and
456C<builder> to C<_build_${attribute_name}> to allow on-demand generated
457attributes. This feature was my attempt to fix my incompetence when
458originally designing C<lazy_build>, and is also implemented by
876b1e94 459L<MooseX::AttributeShortcuts>. There is, however, nothing to stop you
460using C<lazy> and C<builder> yourself with C<rwp> or C<rw> - it's just that
461this isn't generally a good idea so we don't provide a shortcut for it.
71db76ce 462
463C<rwp> generates a reader like C<ro>, but also sets C<writer> to
464C<_set_${attribute_name}> for attributes that are designed to be written
465from inside of the class, but read-only from outside.
466This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 467
6577509a 468C<rw> generates a normal getter/setter by defaulting C<accessor> to the
469name of the attribute.
470
8146585e 471=item * isa
472
52e8f144 473Takes a coderef which is meant to validate the attribute. Unlike L<Moose>, Moo
8146585e 474does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
475one should do
476
c9f73a63 477 isa => sub {
8146585e 478 die "$_[0] is not a number!" unless looks_like_number $_[0]
479 },
480
9a3fc505 481Note that the return value is ignored, only whether the sub lives or
482dies matters.
483
8146585e 484L<Sub::Quote aware|/SUB QUOTE AWARE>
485
c4074652 486Since L<Moo> does B<not> run the C<isa> check before C<coerce> if a coercion
487subroutine has been supplied, C<isa> checks are not structural to your code
488and can, if desired, be omitted on non-debug builds (although if this results
489in an uncaught bug causing your program to break, the L<Moo> authors guarantee
490nothing except that you get to keep both halves).
491
71db76ce 492If you want L<MooseX::Types> style named types, look at
493L<MooX::Types::MooseLike>.
494
495To cause your C<isa> entries to be automatically mapped to named
496L<Moose::Meta::TypeConstraint> objects (rather than the default behaviour
497of creating an anonymous type), set:
498
499 $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub {
500 require MooseX::Types::Something;
501 return MooseX::Types::Something::TypeName();
502 };
503
504Note that this example is purely illustrative; anything that returns a
505L<Moose::Meta::TypeConstraint> object or something similar enough to it to
506make L<Moose> happy is fine.
507
8146585e 508=item * coerce
509
510Takes a coderef which is meant to coerce the attribute. The basic idea is to
511do something like the following:
512
c9f73a63 513 coerce => sub {
8146585e 514 $_[0] + 1 unless $_[0] % 2
515 },
516
52e8f144 517Note that L<Moo> will always fire your coercion: this is to permit
518C<isa> entries to be used purely for bug trapping, whereas coercions are
c4074652 519always structural to your code. We do, however, apply any supplied C<isa>
520check after the coercion has run to ensure that it returned a valid value.
8146585e 521
23a3e34e 522L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 523
e1efec09 524=item * handles
525
526Takes a string
527
69673ca7 528 handles => 'RobotRole'
529
530Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
531becomes the list of methods to handle.
e1efec09 532
533Takes a list of methods
534
535 handles => [ qw( one two ) ]
536
537Takes a hashref
538
539 handles => {
540 un => 'one',
541 }
542
cc7ad717 543=item * C<trigger>
8146585e 544
6fe5100d 545Takes a coderef which will get called any time the attribute is set. This
cc7ad717 546includes the constructor, but not default or built values. Coderef will be
547invoked against the object with the new value as an argument.
8146585e 548
71db76ce 549If you set this to just C<1>, it generates a trigger which calls the
550C<_trigger_${attr_name}> method on C<$self>. This feature comes from
551L<MooseX::AttributeShortcuts>.
552
2e575bcd 553Note that Moose also passes the old value, if any; this feature is not yet
554supported.
555
8146585e 556L<Sub::Quote aware|/SUB QUOTE AWARE>
557
52e8f144 558=item * C<default>
8146585e 559
2e575bcd 560Takes a coderef which will get called with $self as its only argument
561to populate an attribute if no value is supplied to the constructor - or
562if the attribute is lazy, when the attribute is first retrieved if no
563value has yet been provided.
564
0e43f98f 565If a simple scalar is provided, it will be inlined as a string. Any non-code
566reference (hash, array) will result in an error - for that case instead use
567a code reference that returns the desired value.
568
2e575bcd 569Note that if your default is fired during new() there is no guarantee that
570other attributes have been populated yet so you should not rely on their
571existence.
8146585e 572
573L<Sub::Quote aware|/SUB QUOTE AWARE>
574
52e8f144 575=item * C<predicate>
8146585e 576
2e575bcd 577Takes a method name which will return true if an attribute has a value.
8146585e 578
71db76ce 579If you set this to just C<1>, the predicate is automatically named
580C<has_${attr_name}> if your attribute's name does not start with an
157aa466 581underscore, or C<_has_${attr_name_without_the_underscore}> if it does.
71db76ce 582This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 583
52e8f144 584=item * C<builder>
8146585e 585
2e575bcd 586Takes a method name which will be called to create the attribute - functions
587exactly like default except that instead of calling
588
589 $default->($self);
590
591Moo will call
592
593 $self->$builder;
8146585e 594
4752c97b 595The following features come from L<MooseX::AttributeShortcuts>:
596
ba19b6a9 597If you set this to just C<1>, the builder is automatically named
4752c97b 598C<_build_${attr_name}>.
599
600If you set this to a coderef or code-convertible object, that variable will be
601installed under C<$class::_build_${attr_name}> and the builder set to the same
602name.
71db76ce 603
52e8f144 604=item * C<clearer>
8146585e 605
606Takes a method name which will clear the attribute.
607
71db76ce 608If you set this to just C<1>, the clearer is automatically named
609C<clear_${attr_name}> if your attribute's name does not start with an
610underscore, or <_clear_${attr_name_without_the_underscore}> if it does.
611This feature comes from L<MooseX::AttributeShortcuts>.
612
52e8f144 613=item * C<lazy>
8146585e 614
615B<Boolean>. Set this if you want values for the attribute to be grabbed
616lazily. This is usually a good idea if you have a L</builder> which requires
617another attribute to be set.
618
52e8f144 619=item * C<required>
8146585e 620
621B<Boolean>. Set this if the attribute must be passed on instantiation.
622
52e8f144 623=item * C<reader>
1eba910c 624
625The value of this attribute will be the name of the method to get the value of
626the attribute. If you like Java style methods, you might set this to
627C<get_foo>
628
52e8f144 629=item * C<writer>
1eba910c 630
631The value of this attribute will be the name of the method to set the value of
632the attribute. If you like Java style methods, you might set this to
52e8f144 633C<set_foo>.
1eba910c 634
52e8f144 635=item * C<weak_ref>
8146585e 636
637B<Boolean>. Set this if you want the reference that the attribute contains to
638be weakened; use this when circular references are possible, which will cause
639leaks.
640
52e8f144 641=item * C<init_arg>
8146585e 642
643Takes the name of the key to look for at instantiation time of the object. A
644common use of this is to make an underscored attribute have a non-underscored
645initialization name. C<undef> means that passing the value in on instantiation
71db76ce 646is ignored.
8146585e 647
7887ffd0 648=item * C<moosify>
649
650Takes either a coderef or array of coderefs which is meant to transform the
651given attributes specifications if necessary when upgrading to a Moose role or
652class. You shouldn't need this by default, but is provided as a means of
653possible extensibility.
654
8146585e 655=back
656
657=head2 before
658
659 before foo => sub { ... };
660
661See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
662documentation.
663
664=head2 around
665
666 around foo => sub { ... };
667
668See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
669documentation.
670
671=head2 after
672
673 after foo => sub { ... };
674
675See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
676documentation.
677
8146585e 678=head1 SUB QUOTE AWARE
679
680L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
681giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
682aware can take advantage of this.
683
c9f73a63 684To do this, you can write
685
686 use Moo;
687 use Sub::Quote;
688
689 has foo => (
3b4a915a 690 is => 'ro',
691 isa => quote_sub(q{ die "Not <3" unless $_[0] < 3 })
c9f73a63 692 );
693
694which will be inlined as
695
696 do {
697 local @_ = ($_[0]->{foo});
698 die "Not <3" unless $_[0] < 3;
699 }
700
701or to avoid localizing @_,
702
703 has foo => (
3b4a915a 704 is => 'ro',
705 isa => quote_sub(q{ my ($val) = @_; die "Not <3" unless $val < 3 })
c9f73a63 706 );
707
708which will be inlined as
709
710 do {
711 my ($val) = ($_[0]->{foo});
712 die "Not <3" unless $val < 3;
713 }
714
715See L<Sub::Quote> for more information, including how to pass lexical
52e8f144 716captures that will also be compiled into the subroutine.
c9f73a63 717
2e575bcd 718=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 719
52e8f144 720There is no built-in type system. C<isa> is verified with a coderef; if you
8146585e 721need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 722that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
723to L<MooseX::Types::Moose> so that you can write
724
725 has days_to_live => (is => 'ro', isa => Int);
726
727and have it work with both; it is hoped that providing only subrefs as an
728API will encourage the use of other type systems as well, since it's
729probably the weakest part of Moose design-wise.
8146585e 730
2e575bcd 731C<initializer> is not supported in core since the author considers it to be a
0e43f98f 732bad idea and Moose best practices recommend avoiding it. Meanwhile C<trigger> or
f88623a1 733C<coerce> are more likely to be able to fulfill your needs.
8146585e 734
735There is no meta object. If you need this level of complexity you wanted
2e575bcd 736L<Moose> - Moo succeeds at being small because it explicitly does not
f9755246 737provide a metaprotocol. However, if you load L<Moose>, then
738
739 Class::MOP::class_of($moo_class_or_role)
740
741will return an appropriate metaclass pre-populated by L<Moo>.
8146585e 742
13e41b70 743No support for C<super>, C<override>, C<inner>, or C<augment> - the author
744considers augment to be a bad idea, and override can be translated:
745
746 override foo => sub {
747 ...
748 super();
749 ...
750 };
751
752 around foo => sub {
753 my ($orig, $self) = (shift, shift);
754 ...
755 $self->$orig(@_);
756 ...
757 };
8146585e 758
f2eac33e 759The C<dump> method is not provided by default. The author suggests loading
c96a6326 760L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
761using C<$obj-E<gt>$::Dwarn()> instead.
762
0e43f98f 763L</default> only supports coderefs and plain scalars, because passing a hash
764or array reference as a default is almost always incorrect since the value is
765then shared between all objects using that default.
8146585e 766
f9755246 767C<lazy_build> is not supported; you are instead encouraged to use the
52e8f144 768C<< is => 'lazy' >> option supported by L<Moo> and L<MooseX::AttributeShortcuts>.
8146585e 769
0e43f98f 770C<auto_deref> is not supported since the author considers it a bad idea and
771it has been considered best practice to avoid it for some time.
8146585e 772
f9755246 773C<documentation> will show up in a L<Moose> metaclass created from your class
c4074652 774but is otherwise ignored. Then again, L<Moose> ignores it as well, so this
f9755246 775is arguably not an incompatibility.
40f3e3aa 776
c4074652 777Since C<coerce> does not require C<isa> to be defined but L<Moose> does
52e8f144 778require it, the metaclass inflation for coerce alone is a trifle insane
c4074652 779and if you attempt to subtype the result will almost certainly break.
780
69673ca7 781Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
782similar invocation for L<Moose> would be:
783
784 use Moose;
785 use warnings FATAL => "all";
786
787Additionally, L<Moo> supports a set of attribute option shortcuts intended to
788reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 789module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 790
791 package MyClass;
792 use Moo;
793
794The nearest L<Moose> invocation would be:
795
796 package MyClass;
797
798 use Moose;
799 use warnings FATAL => "all";
800 use MooseX::AttributeShortcuts;
801
5902c1fc 802or, if you're inheriting from a non-Moose class,
803
804 package MyClass;
805
806 use Moose;
807 use MooseX::NonMoose;
808 use warnings FATAL => "all";
809 use MooseX::AttributeShortcuts;
810
811Finally, Moose requires you to call
812
813 __PACKAGE__->meta->make_immutable;
814
815at the end of your class to get an inlined (i.e. not horribly slow)
816constructor. Moo does it automatically the first time ->new is called
917f27ca 817on your class. (C<make_immutable> is a no-op in Moo to ease migration.)
5902c1fc 818
6ad9aeab 819An extension L<MooX::late> exists to ease translating Moose packages
820to Moo by providing a more Moose-like interface.
821
660f3db2 822=head1 SUPPORT
823
cb21f16e 824Users' IRC: #moose on irc.perl.org
9836a6ee 825
cb21f16e 826=for html <a href="http://chat.mibbit.com/#moose@irc.perl.org">(click for instant chatroom login)</a>
827
828Development and contribution IRC: #web-simple on irc.perl.org
829
830=for html <a href="http://chat.mibbit.com/#web-simple@irc.perl.org">(click for instant chatroom login)</a>
072d158f 831
832Bugtracker: L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Moo>
833
834Git repository: L<git://git.shadowcat.co.uk/gitmo/Moo.git>
835
836Git web access: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Moo.git>
660f3db2 837
40f3e3aa 838=head1 AUTHOR
839
840mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
841
842=head1 CONTRIBUTORS
843
5da684a2 844dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
845
846frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
847
848hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
849
850jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
851
852ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 853
11f7a042 854chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
855
a17be455 856ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
857
7b8177f8 858doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
859
1fb2de92 860perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
861
3202e039 862Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
863
e355471c 864ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
865
1d17c7c1 866tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
867
d092b5ff 868haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
869
80fd66d7 870mattp - Matt Phillips (cpan:MATTP) <mattp@cpan.org>
871
40f3e3aa 872=head1 COPYRIGHT
873
a958e36d 874Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 875as listed above.
876
877=head1 LICENSE
878
879This library is free software and may be distributed under the same terms
072d158f 880as perl itself. See L<http://dev.perl.org/licenses/>.
40f3e3aa 881
882=cut