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