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