mark inhaled Moose roles with is_role
[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
dcbfe1d9 313=head1 MOO AND CLASS::XSACCESSOR
314
315If a new enough version of L<Class::XSAccessor> is available, it
316will be used to generate simple accessors, readers, and writers for
317a speed boost. Simple accessors are those without lazy defaults,
318type checks/coercions, or triggers. Readers and writers generated
319by L<Class::XSAccessor> will behave slightly differently: they will
320reject attempts to call them with the incorrect number of parameters.
321
c687d016 322=head1 MOO VERSUS ANY::MOOSE
323
324L<Any::Moose> will load L<Mouse> normally, and L<Moose> in a program using
325L<Moose> - which theoretically allows you to get the startup time of L<Mouse>
326without disadvantaging L<Moose> users.
327
328Sadly, this doesn't entirely work, since the selection is load order dependent
329- L<Moo>'s metaclass inflation system explained above in L</MOO AND MOOSE> is
330significantly more reliable.
331
332So if you want to write a CPAN module that loads fast or has only pure perl
333dependencies but is also fully usable by L<Moose> users, you should be using
334L<Moo>.
335
336For a full explanation, see the article
337L<http://shadow.cat/blog/matt-s-trout/moo-versus-any-moose> which explains
338the differing strategies in more detail and provides a direct example of
339where L<Moo> succeeds and L<Any::Moose> fails.
340
8146585e 341=head1 IMPORTED METHODS
342
343=head2 new
344
345 Foo::Bar->new( attr1 => 3 );
346
347or
348
349 Foo::Bar->new({ attr1 => 3 });
350
2e575bcd 351=head2 BUILDARGS
352
f2eac33e 353 sub BUILDARGS {
a17be455 354 my ( $class, @args ) = @_;
355
356 unshift @args, "attr1" if @args % 2 == 1;
357
f2eac33e 358 return { @args };
a17be455 359 };
360
361 Foo::Bar->new( 3 );
362
363The default implementation of this method accepts a hash or hash reference of
364named parameters. If it receives a single argument that isn't a hash reference
365it throws an error.
366
367You can override this method in your class to handle other types of options
368passed to the constructor.
369
370This method should always return a hash reference of named options.
2e575bcd 371
76a0beff 372=head2 FOREIGNBUILDARGS
373
374If you are inheriting from a non-Moo class, the arguments passed to the parent
375class constructor can be manipulated by defining a C<FOREIGNBUILDARGS> method.
416bcb6c 376It will receive the same arguments as C<BUILDARGS>, and should return a list
76a0beff 377of arguments to pass to the parent class constructor.
378
2d00f3d6 379=head2 BUILD
8146585e 380
2d00f3d6 381Define a C<BUILD> method on your class and the constructor will automatically
382call the C<BUILD> method from parent down to child after the object has
383been instantiated. Typically this is used for object validation or possibly
384logging.
8146585e 385
2d00f3d6 386=head2 DEMOLISH
c2cc003f 387
debb3fcd 388If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
389a C<DESTROY> method is created on first object construction which will call
c2cc003f 390C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 391method from child upwards to parents.
392
393Note that the C<DESTROY> method is created on first construction of an object
394of your class in order to not add overhead to classes without C<DEMOLISH>
395methods; this may prove slightly surprising if you try and define your own.
c2cc003f 396
8146585e 397=head2 does
398
399 if ($foo->does('Some::Role1')) {
400 ...
401 }
402
403Returns true if the object composes in the passed role.
404
405=head1 IMPORTED SUBROUTINES
406
407=head2 extends
408
409 extends 'Parent::Class';
410
2e575bcd 411Declares base class. Multiple superclasses can be passed for multiple
412inheritance (but please use roles instead).
413
414Calling extends more than once will REPLACE your superclasses, not add to
415them like 'use base' would.
8146585e 416
417=head2 with
418
419 with 'Some::Role1';
8146585e 420
f9755246 421or
422
423 with 'Some::Role1', 'Some::Role2';
424
425Composes one or more L<Moo::Role> (or L<Role::Tiny>) roles into the current
426class. An error will be raised if these roles have conflicting methods.
8146585e 427
428=head2 has
429
430 has attr => (
431 is => 'ro',
432 );
433
434Declares an attribute for the class.
435
1c9916fa 436 package Foo;
437 use Moo;
438 has 'attr' => (
439 is => 'ro'
440 );
d56136b9 441
1c9916fa 442 package Bar;
443 use Moo;
444 extends 'Foo';
d56136b9 445 has '+attr' => (
446 default => sub { "blah" },
447 );
448
449Using the C<+> notation, it's possible to override an attribute.
450
8146585e 451The options for C<has> are as follows:
452
453=over 2
454
455=item * is
456
6577509a 457B<required>, may be C<ro>, C<lazy>, C<rwp> or C<rw>.
71db76ce 458
459C<ro> generates an accessor that dies if you attempt to write to it - i.e.
460a getter only - by defaulting C<reader> to the name of the attribute.
461
71db76ce 462C<lazy> generates a reader like C<ro>, but also sets C<lazy> to 1 and
463C<builder> to C<_build_${attribute_name}> to allow on-demand generated
464attributes. This feature was my attempt to fix my incompetence when
465originally designing C<lazy_build>, and is also implemented by
876b1e94 466L<MooseX::AttributeShortcuts>. There is, however, nothing to stop you
467using C<lazy> and C<builder> yourself with C<rwp> or C<rw> - it's just that
468this isn't generally a good idea so we don't provide a shortcut for it.
71db76ce 469
470C<rwp> generates a reader like C<ro>, but also sets C<writer> to
471C<_set_${attribute_name}> for attributes that are designed to be written
472from inside of the class, but read-only from outside.
473This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 474
6577509a 475C<rw> generates a normal getter/setter by defaulting C<accessor> to the
476name of the attribute.
477
8146585e 478=item * isa
479
52e8f144 480Takes a coderef which is meant to validate the attribute. Unlike L<Moose>, Moo
8146585e 481does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
482one should do
483
c9f73a63 484 isa => sub {
8146585e 485 die "$_[0] is not a number!" unless looks_like_number $_[0]
486 },
487
9a3fc505 488Note that the return value is ignored, only whether the sub lives or
489dies matters.
490
8146585e 491L<Sub::Quote aware|/SUB QUOTE AWARE>
492
c4074652 493Since L<Moo> does B<not> run the C<isa> check before C<coerce> if a coercion
494subroutine has been supplied, C<isa> checks are not structural to your code
495and can, if desired, be omitted on non-debug builds (although if this results
496in an uncaught bug causing your program to break, the L<Moo> authors guarantee
497nothing except that you get to keep both halves).
498
71db76ce 499If you want L<MooseX::Types> style named types, look at
500L<MooX::Types::MooseLike>.
501
502To cause your C<isa> entries to be automatically mapped to named
503L<Moose::Meta::TypeConstraint> objects (rather than the default behaviour
504of creating an anonymous type), set:
505
506 $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub {
507 require MooseX::Types::Something;
508 return MooseX::Types::Something::TypeName();
509 };
510
511Note that this example is purely illustrative; anything that returns a
512L<Moose::Meta::TypeConstraint> object or something similar enough to it to
513make L<Moose> happy is fine.
514
8146585e 515=item * coerce
516
517Takes a coderef which is meant to coerce the attribute. The basic idea is to
518do something like the following:
519
c9f73a63 520 coerce => sub {
8146585e 521 $_[0] + 1 unless $_[0] % 2
522 },
523
52e8f144 524Note that L<Moo> will always fire your coercion: this is to permit
525C<isa> entries to be used purely for bug trapping, whereas coercions are
c4074652 526always structural to your code. We do, however, apply any supplied C<isa>
527check after the coercion has run to ensure that it returned a valid value.
8146585e 528
23a3e34e 529L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 530
e1efec09 531=item * handles
532
533Takes a string
534
69673ca7 535 handles => 'RobotRole'
536
537Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
538becomes the list of methods to handle.
e1efec09 539
540Takes a list of methods
541
542 handles => [ qw( one two ) ]
543
544Takes a hashref
545
546 handles => {
547 un => 'one',
548 }
549
cc7ad717 550=item * C<trigger>
8146585e 551
6fe5100d 552Takes a coderef which will get called any time the attribute is set. This
cc7ad717 553includes the constructor, but not default or built values. Coderef will be
554invoked against the object with the new value as an argument.
8146585e 555
71db76ce 556If you set this to just C<1>, it generates a trigger which calls the
557C<_trigger_${attr_name}> method on C<$self>. This feature comes from
558L<MooseX::AttributeShortcuts>.
559
2e575bcd 560Note that Moose also passes the old value, if any; this feature is not yet
561supported.
562
8146585e 563L<Sub::Quote aware|/SUB QUOTE AWARE>
564
52e8f144 565=item * C<default>
8146585e 566
2e575bcd 567Takes a coderef which will get called with $self as its only argument
568to populate an attribute if no value is supplied to the constructor - or
569if the attribute is lazy, when the attribute is first retrieved if no
570value has yet been provided.
571
0e43f98f 572If a simple scalar is provided, it will be inlined as a string. Any non-code
573reference (hash, array) will result in an error - for that case instead use
574a code reference that returns the desired value.
575
2e575bcd 576Note that if your default is fired during new() there is no guarantee that
577other attributes have been populated yet so you should not rely on their
578existence.
8146585e 579
580L<Sub::Quote aware|/SUB QUOTE AWARE>
581
52e8f144 582=item * C<predicate>
8146585e 583
2e575bcd 584Takes a method name which will return true if an attribute has a value.
8146585e 585
71db76ce 586If you set this to just C<1>, the predicate is automatically named
587C<has_${attr_name}> if your attribute's name does not start with an
157aa466 588underscore, or C<_has_${attr_name_without_the_underscore}> if it does.
71db76ce 589This feature comes from L<MooseX::AttributeShortcuts>.
8146585e 590
52e8f144 591=item * C<builder>
8146585e 592
2e575bcd 593Takes a method name which will be called to create the attribute - functions
594exactly like default except that instead of calling
595
596 $default->($self);
597
598Moo will call
599
600 $self->$builder;
8146585e 601
4752c97b 602The following features come from L<MooseX::AttributeShortcuts>:
603
ba19b6a9 604If you set this to just C<1>, the builder is automatically named
4752c97b 605C<_build_${attr_name}>.
606
607If you set this to a coderef or code-convertible object, that variable will be
608installed under C<$class::_build_${attr_name}> and the builder set to the same
609name.
71db76ce 610
52e8f144 611=item * C<clearer>
8146585e 612
613Takes a method name which will clear the attribute.
614
71db76ce 615If you set this to just C<1>, the clearer is automatically named
616C<clear_${attr_name}> if your attribute's name does not start with an
617underscore, or <_clear_${attr_name_without_the_underscore}> if it does.
618This feature comes from L<MooseX::AttributeShortcuts>.
619
52e8f144 620=item * C<lazy>
8146585e 621
622B<Boolean>. Set this if you want values for the attribute to be grabbed
623lazily. This is usually a good idea if you have a L</builder> which requires
624another attribute to be set.
625
52e8f144 626=item * C<required>
8146585e 627
628B<Boolean>. Set this if the attribute must be passed on instantiation.
629
52e8f144 630=item * C<reader>
1eba910c 631
632The value of this attribute will be the name of the method to get the value of
633the attribute. If you like Java style methods, you might set this to
634C<get_foo>
635
52e8f144 636=item * C<writer>
1eba910c 637
638The value of this attribute will be the name of the method to set the value of
639the attribute. If you like Java style methods, you might set this to
52e8f144 640C<set_foo>.
1eba910c 641
52e8f144 642=item * C<weak_ref>
8146585e 643
644B<Boolean>. Set this if you want the reference that the attribute contains to
645be weakened; use this when circular references are possible, which will cause
646leaks.
647
52e8f144 648=item * C<init_arg>
8146585e 649
650Takes the name of the key to look for at instantiation time of the object. A
651common use of this is to make an underscored attribute have a non-underscored
652initialization name. C<undef> means that passing the value in on instantiation
71db76ce 653is ignored.
8146585e 654
7887ffd0 655=item * C<moosify>
656
657Takes either a coderef or array of coderefs which is meant to transform the
658given attributes specifications if necessary when upgrading to a Moose role or
659class. You shouldn't need this by default, but is provided as a means of
660possible extensibility.
661
8146585e 662=back
663
664=head2 before
665
666 before foo => sub { ... };
667
668See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
669documentation.
670
671=head2 around
672
673 around foo => sub { ... };
674
675See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
676documentation.
677
678=head2 after
679
680 after foo => sub { ... };
681
682See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
683documentation.
684
8146585e 685=head1 SUB QUOTE AWARE
686
687L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
688giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
689aware can take advantage of this.
690
c9f73a63 691To do this, you can write
692
693 use Moo;
694 use Sub::Quote;
695
696 has foo => (
3b4a915a 697 is => 'ro',
698 isa => quote_sub(q{ die "Not <3" unless $_[0] < 3 })
c9f73a63 699 );
700
701which will be inlined as
702
703 do {
704 local @_ = ($_[0]->{foo});
705 die "Not <3" unless $_[0] < 3;
706 }
707
708or to avoid localizing @_,
709
710 has foo => (
3b4a915a 711 is => 'ro',
712 isa => quote_sub(q{ my ($val) = @_; die "Not <3" unless $val < 3 })
c9f73a63 713 );
714
715which will be inlined as
716
717 do {
718 my ($val) = ($_[0]->{foo});
719 die "Not <3" unless $val < 3;
720 }
721
722See L<Sub::Quote> for more information, including how to pass lexical
52e8f144 723captures that will also be compiled into the subroutine.
c9f73a63 724
2e575bcd 725=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 726
52e8f144 727There is no built-in type system. C<isa> is verified with a coderef; if you
8146585e 728need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 729that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
730to L<MooseX::Types::Moose> so that you can write
731
732 has days_to_live => (is => 'ro', isa => Int);
733
734and have it work with both; it is hoped that providing only subrefs as an
735API will encourage the use of other type systems as well, since it's
736probably the weakest part of Moose design-wise.
8146585e 737
2e575bcd 738C<initializer> is not supported in core since the author considers it to be a
0e43f98f 739bad idea and Moose best practices recommend avoiding it. Meanwhile C<trigger> or
f88623a1 740C<coerce> are more likely to be able to fulfill your needs.
8146585e 741
742There is no meta object. If you need this level of complexity you wanted
2e575bcd 743L<Moose> - Moo succeeds at being small because it explicitly does not
f9755246 744provide a metaprotocol. However, if you load L<Moose>, then
745
746 Class::MOP::class_of($moo_class_or_role)
747
748will return an appropriate metaclass pre-populated by L<Moo>.
8146585e 749
13e41b70 750No support for C<super>, C<override>, C<inner>, or C<augment> - the author
751considers augment to be a bad idea, and override can be translated:
752
753 override foo => sub {
754 ...
755 super();
756 ...
757 };
758
759 around foo => sub {
760 my ($orig, $self) = (shift, shift);
761 ...
762 $self->$orig(@_);
763 ...
764 };
8146585e 765
f2eac33e 766The C<dump> method is not provided by default. The author suggests loading
c96a6326 767L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
768using C<$obj-E<gt>$::Dwarn()> instead.
769
0e43f98f 770L</default> only supports coderefs and plain scalars, because passing a hash
771or array reference as a default is almost always incorrect since the value is
772then shared between all objects using that default.
8146585e 773
f9755246 774C<lazy_build> is not supported; you are instead encouraged to use the
52e8f144 775C<< is => 'lazy' >> option supported by L<Moo> and L<MooseX::AttributeShortcuts>.
8146585e 776
0e43f98f 777C<auto_deref> is not supported since the author considers it a bad idea and
778it has been considered best practice to avoid it for some time.
8146585e 779
f9755246 780C<documentation> will show up in a L<Moose> metaclass created from your class
c4074652 781but is otherwise ignored. Then again, L<Moose> ignores it as well, so this
f9755246 782is arguably not an incompatibility.
40f3e3aa 783
c4074652 784Since C<coerce> does not require C<isa> to be defined but L<Moose> does
52e8f144 785require it, the metaclass inflation for coerce alone is a trifle insane
c4074652 786and if you attempt to subtype the result will almost certainly break.
787
69673ca7 788Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
789similar invocation for L<Moose> would be:
790
791 use Moose;
792 use warnings FATAL => "all";
793
794Additionally, L<Moo> supports a set of attribute option shortcuts intended to
795reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 796module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 797
798 package MyClass;
799 use Moo;
800
801The nearest L<Moose> invocation would be:
802
803 package MyClass;
804
805 use Moose;
806 use warnings FATAL => "all";
807 use MooseX::AttributeShortcuts;
808
5902c1fc 809or, if you're inheriting from a non-Moose class,
810
811 package MyClass;
812
813 use Moose;
814 use MooseX::NonMoose;
815 use warnings FATAL => "all";
816 use MooseX::AttributeShortcuts;
817
818Finally, Moose requires you to call
819
820 __PACKAGE__->meta->make_immutable;
821
822at the end of your class to get an inlined (i.e. not horribly slow)
823constructor. Moo does it automatically the first time ->new is called
917f27ca 824on your class. (C<make_immutable> is a no-op in Moo to ease migration.)
5902c1fc 825
6ad9aeab 826An extension L<MooX::late> exists to ease translating Moose packages
827to Moo by providing a more Moose-like interface.
828
660f3db2 829=head1 SUPPORT
830
cb21f16e 831Users' IRC: #moose on irc.perl.org
9836a6ee 832
cb21f16e 833=for html <a href="http://chat.mibbit.com/#moose@irc.perl.org">(click for instant chatroom login)</a>
834
835Development and contribution IRC: #web-simple on irc.perl.org
836
837=for html <a href="http://chat.mibbit.com/#web-simple@irc.perl.org">(click for instant chatroom login)</a>
072d158f 838
839Bugtracker: L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Moo>
840
841Git repository: L<git://git.shadowcat.co.uk/gitmo/Moo.git>
842
843Git web access: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Moo.git>
660f3db2 844
40f3e3aa 845=head1 AUTHOR
846
847mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
848
849=head1 CONTRIBUTORS
850
5da684a2 851dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
852
853frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
854
855hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
856
857jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
858
859ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 860
11f7a042 861chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
862
a17be455 863ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
864
7b8177f8 865doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
866
1fb2de92 867perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
868
3202e039 869Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
870
e355471c 871ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
872
1d17c7c1 873tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
874
d092b5ff 875haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
876
80fd66d7 877mattp - Matt Phillips (cpan:MATTP) <mattp@cpan.org>
878
40f3e3aa 879=head1 COPYRIGHT
880
a958e36d 881Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 882as listed above.
883
884=head1 LICENSE
885
886This library is free software and may be distributed under the same terms
072d158f 887as perl itself. See L<http://dev.perl.org/licenses/>.
40f3e3aa 888
889=cut