preserve attribute ordering
[gitmo/Moo.git] / lib / Moo.pm
CommitLineData
b1eebd55 1package Moo;
6c74d087 2
3use strictures 1;
b1eebd55 4use Moo::_Utils;
e0e12d16 5use B 'perlstring';
6c74d087 6
35ddd7d1 7our $VERSION = '0.091001'; # 0.91.1
6d71fae7 8$VERSION = eval $VERSION;
9
c2cb1fed 10require Moo::sification;
8c46a8f6 11
14f32032 12our %MAKERS;
13
6c74d087 14sub import {
15 my $target = caller;
a16d301e 16 my $class = shift;
de3d4906 17 strictures->import;
1ba11455 18 return if $MAKERS{$target}; # already exported into this package
575ba24c 19 _install_coderef "${target}::extends" => sub {
fb5074f6 20 _load_module($_) for @_;
786e5ba0 21 # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA
22 @{*{_getglob("${target}::ISA")}{ARRAY}} = @_;
3b0d7efd 23 if (my $old = delete $Moo::MAKERS{$target}{constructor}) {
24 delete _getstash($target)->{new};
25 Moo->_constructor_maker_for($target)
26 ->register_attribute_specs(%{$old->all_attribute_specs});
27 }
6c74d087 28 };
575ba24c 29 _install_coderef "${target}::with" => sub {
faa9ce11 30 require Moo::Role;
6893ea30 31 Moo::Role->apply_roles_to_package($target, $_[0]);
6c74d087 32 };
a16d301e 33 $MAKERS{$target} = {};
575ba24c 34 _install_coderef "${target}::has" => sub {
14f32032 35 my ($name, %spec) = @_;
a16d301e 36 $class->_constructor_maker_for($target)
37 ->register_attribute_specs($name, \%spec);
02e9ef74 38 $class->_accessor_maker_for($target)
39 ->generate_method($target, $name, \%spec);
14f32032 40 };
6c74d087 41 foreach my $type (qw(before after around)) {
575ba24c 42 _install_coderef "${target}::${type}" => sub {
faa9ce11 43 require Class::Method::Modifiers;
6c74d087 44 _install_modifier($target, $type, @_);
45 };
46 }
47 {
48 no strict 'refs';
49 @{"${target}::ISA"} = do {
faa9ce11 50 require Moo::Object; ('Moo::Object');
6c74d087 51 } unless @{"${target}::ISA"};
52 }
3362e41c 53 if ($INC{'Moo/HandleMoose.pm'}) {
54 Moo::HandleMoose::inject_fake_metaclass_for($target);
55 }
6c74d087 56}
57
02e9ef74 58sub _accessor_maker_for {
59 my ($class, $target) = @_;
60 return unless $MAKERS{$target};
61 $MAKERS{$target}{accessor} ||= do {
62 my $maker_class = do {
63 if (my $m = do {
64 if (my $defer_target =
65 (Sub::Defer::defer_info($target->can('new'))||[])->[0]
66 ) {
67 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
68 $MAKERS{$pkg} && $MAKERS{$pkg}{accessor};
69 } else {
70 undef;
71 }
72 }) {
73 ref($m);
74 } else {
75 require Method::Generate::Accessor;
76 'Method::Generate::Accessor'
77 }
78 };
79 $maker_class->new;
80 }
81}
82
a16d301e 83sub _constructor_maker_for {
c4570291 84 my ($class, $target, $select_super) = @_;
a16d301e 85 return unless $MAKERS{$target};
86 $MAKERS{$target}{constructor} ||= do {
faa9ce11 87 require Method::Generate::Constructor;
88 require Sub::Defer;
c4570291 89 my ($moo_constructor, $con);
de5c0e53 90
c4570291 91 if ($select_super && $MAKERS{$select_super}) {
92 $moo_constructor = 1;
93 $con = $MAKERS{$select_super}{constructor};
94 } else {
de5c0e53 95 my $t_new = $target->can('new');
c4570291 96 if ($t_new) {
97 if ($t_new == Moo::Object->can('new')) {
98 $moo_constructor = 1;
99 } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) {
100 my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/);
101 if ($MAKERS{$pkg}) {
102 $moo_constructor = 1;
103 $con = $MAKERS{$pkg}{constructor};
104 }
105 }
106 } else {
107 $moo_constructor = 1; # no other constructor, make a Moo one
108 }
de5c0e53 109 };
02e9ef74 110 ($con ? ref($con) : 'Method::Generate::Constructor')
a16d301e 111 ->new(
112 package => $target,
02e9ef74 113 accessor_generator => $class->_accessor_maker_for($target),
53875e2c 114 construction_string => (
115 $moo_constructor
116 ? ($con ? $con->construction_string : undef)
117 : ('$class->'.$target.'::SUPER::new(@_)')
e0e12d16 118 ),
76ab3977 119 subconstructor_handler => (
120 ' if ($Moo::MAKERS{$class}) {'."\n"
121 .' '.$class.'->_constructor_maker_for($class,'.perlstring($target).');'."\n"
122 .' return $class->new(@_)'.";\n"
123 .' }'."\n"
e0e12d16 124 ),
a16d301e 125 )
126 ->install_delayed
de5c0e53 127 ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
a16d301e 128 }
129}
130
6c74d087 1311;
a17be455 132=pod
133
134=encoding utf-8
8146585e 135
505f8b7a 136=head1 NAME
137
138Moo - Minimalist Object Orientation (with Moose compatiblity)
139
8146585e 140=head1 SYNOPSIS
141
142 package Cat::Food;
143
144 use Moo;
145 use Sub::Quote;
146
147 sub feed_lion {
148 my $self = shift;
149 my $amount = shift || 1;
150
151 $self->pounds( $self->pounds - $amount );
152 }
153
154 has taste => (
155 is => 'ro',
156 );
157
158 has brand => (
159 is => 'ro',
160 isa => sub {
161 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
162 },
163);
164
165 has pounds => (
166 is => 'rw',
167 isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
168 );
169
170 1;
171
172and else where
173
174 my $full = Cat::Food->new(
175 taste => 'DELICIOUS.',
176 brand => 'SWEET-TREATZ',
177 pounds => 10,
178 );
179
180 $full->feed_lion;
181
182 say $full->pounds;
183
184=head1 DESCRIPTION
185
186This module is an extremely light-weight, high-performance L<Moose> replacement.
187It also avoids depending on any XS modules to allow simple deployments. The
188name C<Moo> is based on the idea that it provides almost -but not quite- two
189thirds of L<Moose>.
190
191Unlike C<Mouse> this module does not aim at full L<Moose> compatibility. See
192L</INCOMPATIBILITIES> for more details.
193
5d5bb71d 194=head1 WHY MOO EXISTS
195
196If you want a full object system with a rich Metaprotocol, L<Moose> is
197already wonderful.
198
199I've tried several times to use L<Mouse> but it's 3x the size of Moo and
200takes longer to load than most of my Moo based CGI scripts take to run.
201
202If you don't want L<Moose>, you don't want "less metaprotocol" like L<Mouse>,
203you want "as little as possible" - which means "no metaprotocol", which is
204what Moo provides.
205
206By Moo 1.0 I intend to have Moo's equivalent of L<Any::Moose> built in -
207if Moose gets loaded, any Moo class or role will act as a Moose equivalent
208if treated as such.
209
210Hence - Moo exists as its name - Minimal Object Orientation - with a pledge
211to make it smooth to upgrade to L<Moose> when you need more than minimal
212features.
213
1fce5bc9 214=head1 Moo and Moose - NEW, EXPERIMENTAL
215
216If L<Moo> detects L<Moose> being loaded, it will automatically register
217metaclasses for your L<Moo> and L<Moo::Role> packages, so you should be able
218to use them in L<Moose> code without it ever realising you aren't using
219L<Moose> everywhere.
220
221Extending a L<Moose> class or consuming a L<Moose::Role> should also work.
222
660f3db2 223This means that there is no need for anything like L<Any::Moose> for Moo
224code - Moo and Moose code should simply interoperate without problem.
225
226However, these features are new as of 0.91.0 (0.091000) so while serviceable,
227they are absolutely certain to not be 100% yet; please do report bugs.
1fce5bc9 228
229If you need to disable the metaclass creation, add:
230
231 no Moo::sification;
232
233to your code before Moose is loaded, but bear in mind that this switch is
234currently global and turns the mechanism off entirely, so don't put this
235in library code, only in a top level script as a temporary measure while
236you send a bug report.
237
8146585e 238=head1 IMPORTED METHODS
239
240=head2 new
241
242 Foo::Bar->new( attr1 => 3 );
243
244or
245
246 Foo::Bar->new({ attr1 => 3 });
247
2e575bcd 248=head2 BUILDARGS
249
f2eac33e 250 sub BUILDARGS {
a17be455 251 my ( $class, @args ) = @_;
252
253 unshift @args, "attr1" if @args % 2 == 1;
254
f2eac33e 255 return { @args };
a17be455 256 };
257
258 Foo::Bar->new( 3 );
259
260The default implementation of this method accepts a hash or hash reference of
261named parameters. If it receives a single argument that isn't a hash reference
262it throws an error.
263
264You can override this method in your class to handle other types of options
265passed to the constructor.
266
267This method should always return a hash reference of named options.
2e575bcd 268
2d00f3d6 269=head2 BUILD
8146585e 270
2d00f3d6 271Define a C<BUILD> method on your class and the constructor will automatically
272call the C<BUILD> method from parent down to child after the object has
273been instantiated. Typically this is used for object validation or possibly
274logging.
8146585e 275
2d00f3d6 276=head2 DEMOLISH
c2cc003f 277
debb3fcd 278If you have a C<DEMOLISH> method anywhere in your inheritance hierarchy,
279a C<DESTROY> method is created on first object construction which will call
c2cc003f 280C<< $instance->DEMOLISH($in_global_destruction) >> for each C<DEMOLISH>
debb3fcd 281method from child upwards to parents.
282
283Note that the C<DESTROY> method is created on first construction of an object
284of your class in order to not add overhead to classes without C<DEMOLISH>
285methods; this may prove slightly surprising if you try and define your own.
c2cc003f 286
8146585e 287=head2 does
288
289 if ($foo->does('Some::Role1')) {
290 ...
291 }
292
293Returns true if the object composes in the passed role.
294
295=head1 IMPORTED SUBROUTINES
296
297=head2 extends
298
299 extends 'Parent::Class';
300
2e575bcd 301Declares base class. Multiple superclasses can be passed for multiple
302inheritance (but please use roles instead).
303
304Calling extends more than once will REPLACE your superclasses, not add to
305them like 'use base' would.
8146585e 306
307=head2 with
308
309 with 'Some::Role1';
310 with 'Some::Role2';
311
312Composes a L<Role::Tiny> into current class. Only one role may be composed in
313at a time to allow the code to remain as simple as possible.
314
315=head2 has
316
317 has attr => (
318 is => 'ro',
319 );
320
321Declares an attribute for the class.
322
323The options for C<has> are as follows:
324
325=over 2
326
327=item * is
328
329B<required>, must be C<ro> or C<rw>. Unsurprisingly, C<ro> generates an
0654a8fa 330accessor that will not respond to arguments; to be clear: a getter only. C<rw>
8146585e 331will create a perlish getter/setter.
332
333=item * isa
334
335Takes a coderef which is meant to validate the attribute. Unlike L<Moose> Moo
336does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
337one should do
338
339 isa => quote_sub q{
340 die "$_[0] is not a number!" unless looks_like_number $_[0]
341 },
342
343L<Sub::Quote aware|/SUB QUOTE AWARE>
344
345=item * coerce
346
347Takes a coderef which is meant to coerce the attribute. The basic idea is to
348do something like the following:
349
350 coerce => quote_sub q{
351 $_[0] + 1 unless $_[0] % 2
352 },
353
23a3e34e 354Coerce does not require C<isa> to be defined.
8146585e 355
23a3e34e 356L<Sub::Quote aware|/SUB QUOTE AWARE>
2e575bcd 357
e1efec09 358=item * handles
359
360Takes a string
361
69673ca7 362 handles => 'RobotRole'
363
364Where C<RobotRole> is a role (L<Moo::Role>) that defines an interface which
365becomes the list of methods to handle.
e1efec09 366
367Takes a list of methods
368
369 handles => [ qw( one two ) ]
370
371Takes a hashref
372
373 handles => {
374 un => 'one',
375 }
376
8146585e 377=item * trigger
378
6fe5100d 379Takes a coderef which will get called any time the attribute is set. This
380includes the constructor. Coderef will be invoked against the object with the
381new value as an argument.
8146585e 382
2e575bcd 383Note that Moose also passes the old value, if any; this feature is not yet
384supported.
385
8146585e 386L<Sub::Quote aware|/SUB QUOTE AWARE>
387
388=item * default
389
2e575bcd 390Takes a coderef which will get called with $self as its only argument
391to populate an attribute if no value is supplied to the constructor - or
392if the attribute is lazy, when the attribute is first retrieved if no
393value has yet been provided.
394
395Note that if your default is fired during new() there is no guarantee that
396other attributes have been populated yet so you should not rely on their
397existence.
8146585e 398
399L<Sub::Quote aware|/SUB QUOTE AWARE>
400
401=item * predicate
402
2e575bcd 403Takes a method name which will return true if an attribute has a value.
8146585e 404
405A common example of this would be to call it C<has_$foo>, implying that the
406object has a C<$foo> set.
407
408=item * builder
409
2e575bcd 410Takes a method name which will be called to create the attribute - functions
411exactly like default except that instead of calling
412
413 $default->($self);
414
415Moo will call
416
417 $self->$builder;
8146585e 418
419=item * clearer
420
421Takes a method name which will clear the attribute.
422
423=item * lazy
424
425B<Boolean>. Set this if you want values for the attribute to be grabbed
426lazily. This is usually a good idea if you have a L</builder> which requires
427another attribute to be set.
428
429=item * required
430
431B<Boolean>. Set this if the attribute must be passed on instantiation.
432
1eba910c 433=item * reader
434
435The value of this attribute will be the name of the method to get the value of
436the attribute. If you like Java style methods, you might set this to
437C<get_foo>
438
439=item * writer
440
441The value of this attribute will be the name of the method to set the value of
442the attribute. If you like Java style methods, you might set this to
443C<set_foo>
444
8146585e 445=item * weak_ref
446
447B<Boolean>. Set this if you want the reference that the attribute contains to
448be weakened; use this when circular references are possible, which will cause
449leaks.
450
451=item * init_arg
452
453Takes the name of the key to look for at instantiation time of the object. A
454common use of this is to make an underscored attribute have a non-underscored
455initialization name. C<undef> means that passing the value in on instantiation
456
457=back
458
459=head2 before
460
461 before foo => sub { ... };
462
463See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
464documentation.
465
466=head2 around
467
468 around foo => sub { ... };
469
470See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
471documentation.
472
473=head2 after
474
475 after foo => sub { ... };
476
477See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
478documentation.
479
8146585e 480=head1 SUB QUOTE AWARE
481
482L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
483giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
484aware can take advantage of this.
485
2e575bcd 486=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 487
488You can only compose one role at a time. If your application is large or
5902c1fc 489complex enough to warrant complex composition, you wanted L<Moose>. Note that
490this does not mean you can only compose one role per class -
8146585e 491
5902c1fc 492 with 'FirstRole';
493 with 'SecondRole';
494
495is absolutely fine, there's just currently no equivalent of Moose's
496
497 with 'FirstRole', 'SecondRole';
498
499which composes the two roles together, and then applies them.
500
501There is no built in type system. C<isa> is verified with a coderef, if you
8146585e 502need complex types, just make a library of coderefs, or better yet, functions
5902c1fc 503that return quoted subs. L<MooX::Types::MooseLike> provides a similar API
504to L<MooseX::Types::Moose> so that you can write
505
506 has days_to_live => (is => 'ro', isa => Int);
507
508and have it work with both; it is hoped that providing only subrefs as an
509API will encourage the use of other type systems as well, since it's
510probably the weakest part of Moose design-wise.
8146585e 511
2e575bcd 512C<initializer> is not supported in core since the author considers it to be a
f88623a1 513bad idea but may be supported by an extension in future. Meanwhile C<trigger> or
514C<coerce> are more likely to be able to fulfill your needs.
8146585e 515
516There is no meta object. If you need this level of complexity you wanted
2e575bcd 517L<Moose> - Moo succeeds at being small because it explicitly does not
518provide a metaprotocol.
8146585e 519
2e575bcd 520No support for C<super>, C<override>, C<inner>, or C<augment> - override can
521be handled by around albeit with a little more typing, and the author considers
522augment to be a bad idea.
8146585e 523
f2eac33e 524The C<dump> method is not provided by default. The author suggests loading
c96a6326 525L<Devel::Dwarn> into C<main::> (via C<perl -MDevel::Dwarn ...> for example) and
526using C<$obj-E<gt>$::Dwarn()> instead.
527
8146585e 528L</default> only supports coderefs, because doing otherwise is usually a
529mistake anyway.
530
531C<lazy_build> is not supported per se, but of course it will work if you
532manually set all the options it implies.
533
2e575bcd 534C<auto_deref> is not supported since the author considers it a bad idea.
8146585e 535
2e575bcd 536C<documentation> is not supported since it's a very poor replacement for POD.
40f3e3aa 537
69673ca7 538Handling of warnings: when you C<use Moo> we enable FATAL warnings. The nearest
539similar invocation for L<Moose> would be:
540
541 use Moose;
542 use warnings FATAL => "all";
543
544Additionally, L<Moo> supports a set of attribute option shortcuts intended to
545reduce common boilerplate. The set of shortcuts is the same as in the L<Moose>
239d4711 546module L<MooseX::AttributeShortcuts> as of its version 0.009+. So if you:
69673ca7 547
548 package MyClass;
549 use Moo;
550
551The nearest L<Moose> invocation would be:
552
553 package MyClass;
554
555 use Moose;
556 use warnings FATAL => "all";
557 use MooseX::AttributeShortcuts;
558
5902c1fc 559or, if you're inheriting from a non-Moose class,
560
561 package MyClass;
562
563 use Moose;
564 use MooseX::NonMoose;
565 use warnings FATAL => "all";
566 use MooseX::AttributeShortcuts;
567
568Finally, Moose requires you to call
569
570 __PACKAGE__->meta->make_immutable;
571
572at the end of your class to get an inlined (i.e. not horribly slow)
573constructor. Moo does it automatically the first time ->new is called
574on your class.
575
660f3db2 576=head1 SUPPORT
577
578IRC: #web-simple on irc.perl.org
579
40f3e3aa 580=head1 AUTHOR
581
582mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
583
584=head1 CONTRIBUTORS
585
5da684a2 586dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
587
588frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
589
590hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
591
592jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
593
594ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
40f3e3aa 595
11f7a042 596chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
597
a17be455 598ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
599
7b8177f8 600doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
601
1fb2de92 602perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
603
40f3e3aa 604=head1 COPYRIGHT
605
a958e36d 606Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
40f3e3aa 607as listed above.
608
609=head1 LICENSE
610
611This library is free software and may be distributed under the same terms
612as perl itself.
613
614=cut