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