add checks that refaddr of $spec->{isa} and $spec->{coerce} are unchanged
[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
648=back
649
650=head2 before
651
652 before foo => sub { ... };
653
654See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
655documentation.
656
657=head2 around
658
659 around foo => sub { ... };
660
661See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
662documentation.
663
664=head2 after
665
666 after foo => sub { ... };
667
668See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
669documentation.
670
8146585e 671=head1 SUB QUOTE AWARE
672
673L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
674giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
675aware can take advantage of this.
676
c9f73a63 677To do this, you can write
678
679 use Moo;
680 use Sub::Quote;
681
682 has foo => (
3b4a915a 683 is => 'ro',
684 isa => quote_sub(q{ die "Not <3" unless $_[0] < 3 })
c9f73a63 685 );
686
687which will be inlined as
688
689 do {
690 local @_ = ($_[0]->{foo});
691 die "Not <3" unless $_[0] < 3;
692 }
693
694or to avoid localizing @_,
695
696 has foo => (
3b4a915a 697 is => 'ro',
698 isa => quote_sub(q{ my ($val) = @_; die "Not <3" unless $val < 3 })
c9f73a63 699 );
700
701which will be inlined as
702
703 do {
704 my ($val) = ($_[0]->{foo});
705 die "Not <3" unless $val < 3;
706 }
707
708See L<Sub::Quote> for more information, including how to pass lexical
52e8f144 709captures that will also be compiled into the subroutine.
c9f73a63 710
2e575bcd 711=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 712
52e8f144 713There is no built-in type system. C<isa> is verified with a coderef; if you
8146585e 714need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 715that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
716to L<MooseX::Types::Moose> so that you can write
717
718 has days_to_live => (is => 'ro', isa => Int);
719
720and have it work with both; it is hoped that providing only subrefs as an
721API will encourage the use of other type systems as well, since it's
722probably the weakest part of Moose design-wise.
8146585e 723
2e575bcd 724C<initializer> is not supported in core since the author considers it to be a
0e43f98f 725bad idea and Moose best practices recommend avoiding it. Meanwhile C<trigger> or
f88623a1 726C<coerce> are more likely to be able to fulfill your needs.
8146585e 727
728There is no meta object. If you need this level of complexity you wanted
2e575bcd 729L<Moose> - Moo succeeds at being small because it explicitly does not
f9755246 730provide a metaprotocol. However, if you load L<Moose>, then
731
732 Class::MOP::class_of($moo_class_or_role)
733
734will return an appropriate metaclass pre-populated by L<Moo>.
8146585e 735
13e41b70 736No support for C<super>, C<override>, C<inner>, or C<augment> - the author
737considers augment to be a bad idea, and override can be translated:
738
739 override foo => sub {
740 ...
741 super();
742 ...
743 };
744
745 around foo => sub {
746 my ($orig, $self) = (shift, shift);
747 ...
748 $self->$orig(@_);
749 ...
750 };
8146585e 751
f2eac33e 752The C<dump> method is not provided by default. The author suggests loading
c96a6326 753L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
754using C<$obj-E<gt>$::Dwarn()> instead.
755
0e43f98f 756L</default> only supports coderefs and plain scalars, because passing a hash
757or array reference as a default is almost always incorrect since the value is
758then shared between all objects using that default.
8146585e 759
f9755246 760C<lazy_build> is not supported; you are instead encouraged to use the
52e8f144 761C<< is => 'lazy' >> option supported by L<Moo> and L<MooseX::AttributeShortcuts>.
8146585e 762
0e43f98f 763C<auto_deref> is not supported since the author considers it a bad idea and
764it has been considered best practice to avoid it for some time.
8146585e 765
f9755246 766C<documentation> will show up in a L<Moose> metaclass created from your class
c4074652 767but is otherwise ignored. Then again, L<Moose> ignores it as well, so this
f9755246 768is arguably not an incompatibility.
40f3e3aa 769
c4074652 770Since C<coerce> does not require C<isa> to be defined but L<Moose> does
52e8f144 771require it, the metaclass inflation for coerce alone is a trifle insane
c4074652 772and if you attempt to subtype the result will almost certainly break.
773
69673ca7 774Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
775similar invocation for L<Moose> would be:
776
777 use Moose;
778 use warnings FATAL => "all";
779
780Additionally, L<Moo> supports a set of attribute option shortcuts intended to
781reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 782module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 783
784 package MyClass;
785 use Moo;
786
787The nearest L<Moose> invocation would be:
788
789 package MyClass;
790
791 use Moose;
792 use warnings FATAL => "all";
793 use MooseX::AttributeShortcuts;
794
5902c1fc 795or, if you're inheriting from a non-Moose class,
796
797 package MyClass;
798
799 use Moose;
800 use MooseX::NonMoose;
801 use warnings FATAL => "all";
802 use MooseX::AttributeShortcuts;
803
804Finally, Moose requires you to call
805
806 __PACKAGE__->meta->make_immutable;
807
808at the end of your class to get an inlined (i.e. not horribly slow)
809constructor. Moo does it automatically the first time ->new is called
917f27ca 810on your class. (C<make_immutable> is a no-op in Moo to ease migration.)
5902c1fc 811
6ad9aeab 812An extension L<MooX::late> exists to ease translating Moose packages
813to Moo by providing a more Moose-like interface.
814
660f3db2 815=head1 SUPPORT
816
cb21f16e 817Users' IRC: #moose on irc.perl.org
9836a6ee 818
cb21f16e 819=for html <a href="http://chat.mibbit.com/#moose@irc.perl.org">(click for instant chatroom login)</a>
820
821Development and contribution IRC: #web-simple on irc.perl.org
822
823=for html <a href="http://chat.mibbit.com/#web-simple@irc.perl.org">(click for instant chatroom login)</a>
072d158f 824
825Bugtracker: L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Moo>
826
827Git repository: L<git://git.shadowcat.co.uk/gitmo/Moo.git>
828
829Git web access: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Moo.git>
660f3db2 830
40f3e3aa 831=head1 AUTHOR
832
833mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
834
835=head1 CONTRIBUTORS
836
5da684a2 837dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
838
839frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
840
841hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
842
843jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
844
845ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 846
11f7a042 847chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
848
a17be455 849ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
850
7b8177f8 851doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
852
1fb2de92 853perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
854
3202e039 855Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
856
e355471c 857ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
858
1d17c7c1 859tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
860
d092b5ff 861haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
862
80fd66d7 863mattp - Matt Phillips (cpan:MATTP) <mattp@cpan.org>
864
40f3e3aa 865=head1 COPYRIGHT
866
a958e36d 867Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 868as listed above.
869
870=head1 LICENSE
871
872This library is free software and may be distributed under the same terms
072d158f 873as perl itself. See L<http://dev.perl.org/licenses/>.
40f3e3aa 874
875=cut