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