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