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