Make perl -Moo DTRT
[gitmo/Moo.git] / lib / Moo.pm
CommitLineData
b1eebd55 1package Moo;
6c74d087 2
3use strictures 1;
b1eebd55 4use Moo::_Utils;
6c74d087 5
6d71fae7 6our $VERSION = '0.009001'; # 0.9.1
7$VERSION = eval $VERSION;
8
14f32032 9our %MAKERS;
10
6c74d087 11sub import {
12 my $target = caller;
a16d301e 13 my $class = shift;
de3d4906 14 strictures->import;
1ba11455 15 return if $MAKERS{$target}; # already exported into this package
6c74d087 16 *{_getglob("${target}::extends")} = sub {
fb5074f6 17 _load_module($_) for @_;
6c74d087 18 *{_getglob("${target}::ISA")} = \@_;
19 };
20 *{_getglob("${target}::with")} = sub {
b1eebd55 21 require Moo::Role;
6c74d087 22 die "Only one role supported at a time by with" if @_ > 1;
369a4c50 23 Moo::Role->apply_role_to_package($target, $_[0]);
6c74d087 24 };
a16d301e 25 $MAKERS{$target} = {};
14f32032 26 *{_getglob("${target}::has")} = sub {
27 my ($name, %spec) = @_;
28 ($MAKERS{$target}{accessor} ||= do {
29 require Method::Generate::Accessor;
30 Method::Generate::Accessor->new
31 })->generate_method($target, $name, \%spec);
a16d301e 32 $class->_constructor_maker_for($target)
33 ->register_attribute_specs($name, \%spec);
14f32032 34 };
6c74d087 35 foreach my $type (qw(before after around)) {
36 *{_getglob "${target}::${type}"} = sub {
dccea57d 37 require Class::Method::Modifiers;
6c74d087 38 _install_modifier($target, $type, @_);
39 };
40 }
41 {
42 no strict 'refs';
43 @{"${target}::ISA"} = do {
b1eebd55 44 require Moo::Object; ('Moo::Object');
6c74d087 45 } unless @{"${target}::ISA"};
46 }
47}
48
a16d301e 49sub _constructor_maker_for {
50 my ($class, $target) = @_;
51 return unless $MAKERS{$target};
52 $MAKERS{$target}{constructor} ||= do {
53 require Method::Generate::Constructor;
54 Method::Generate::Constructor
55 ->new(
56 package => $target,
57 accessor_generator => do {
58 require Method::Generate::Accessor;
59 Method::Generate::Accessor->new;
60 }
61 )
62 ->install_delayed
63 ->register_attribute_specs(do {
64 my @spec;
5d349892 65 # using the -last- entry in @ISA means that classes created by
66 # Role::Tiny as N roles + superclass will still get the attributes
67 # from the superclass
098a367b 68 if (my $super = do { no strict 'refs'; ${"${target}::ISA"}[-1] }) {
a16d301e 69 if (my $con = $MAKERS{$super}{constructor}) {
70 @spec = %{$con->all_attribute_specs};
71 }
72 }
73 @spec;
74 });
75 }
76}
77
6c74d087 781;
8146585e 79
505f8b7a 80=head1 NAME
81
82Moo - Minimalist Object Orientation (with Moose compatiblity)
83
5ef50c4d 84=head1 WARNING WARNING WARNING
85
86This is a 0.9 release because we're fairly sure it works. For us. Until it's
87tested in the wild, we make no guarantees it also works for you.
88
89If this module does something unexpected, please submit a failing test.
90
91But if it eats your cat, sleeps with your boyfriend, or pushes grandma down
92the stairs to save her from the terrible secret of space, it's not our fault.
93
8146585e 94=head1 SYNOPSIS
95
96 package Cat::Food;
97
98 use Moo;
99 use Sub::Quote;
100
101 sub feed_lion {
102 my $self = shift;
103 my $amount = shift || 1;
104
105 $self->pounds( $self->pounds - $amount );
106 }
107
108 has taste => (
109 is => 'ro',
110 );
111
112 has brand => (
113 is => 'ro',
114 isa => sub {
115 die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
116 },
117);
118
119 has pounds => (
120 is => 'rw',
121 isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
122 );
123
124 1;
125
126and else where
127
128 my $full = Cat::Food->new(
129 taste => 'DELICIOUS.',
130 brand => 'SWEET-TREATZ',
131 pounds => 10,
132 );
133
134 $full->feed_lion;
135
136 say $full->pounds;
137
138=head1 DESCRIPTION
139
140This module is an extremely light-weight, high-performance L<Moose> replacement.
141It also avoids depending on any XS modules to allow simple deployments. The
142name C<Moo> is based on the idea that it provides almost -but not quite- two
143thirds of L<Moose>.
144
145Unlike C<Mouse> this module does not aim at full L<Moose> compatibility. See
146L</INCOMPATIBILITIES> for more details.
147
148=head1 IMPORTED METHODS
149
150=head2 new
151
152 Foo::Bar->new( attr1 => 3 );
153
154or
155
156 Foo::Bar->new({ attr1 => 3 });
157
2e575bcd 158=head2 BUILDARGS
159
160This feature from Moose is not yet supported.
161
8146585e 162=head2 BUILDALL
163
164Don't override (or probably even call) this method. Instead, you can define
165a C<BUILD> method on your class and the constructor will automatically call the
166C<BUILD> method from parent down to child after the object has been
167instantiated. Typically this is used for object validation or possibly logging.
168
169=head2 does
170
171 if ($foo->does('Some::Role1')) {
172 ...
173 }
174
175Returns true if the object composes in the passed role.
176
177=head1 IMPORTED SUBROUTINES
178
179=head2 extends
180
181 extends 'Parent::Class';
182
2e575bcd 183Declares base class. Multiple superclasses can be passed for multiple
184inheritance (but please use roles instead).
185
186Calling extends more than once will REPLACE your superclasses, not add to
187them like 'use base' would.
8146585e 188
189=head2 with
190
191 with 'Some::Role1';
192 with 'Some::Role2';
193
194Composes a L<Role::Tiny> into current class. Only one role may be composed in
195at a time to allow the code to remain as simple as possible.
196
197=head2 has
198
199 has attr => (
200 is => 'ro',
201 );
202
203Declares an attribute for the class.
204
205The options for C<has> are as follows:
206
207=over 2
208
209=item * is
210
211B<required>, must be C<ro> or C<rw>. Unsurprisingly, C<ro> generates an
212accessor that will not respond to arguments; to be clear: a setter only. C<rw>
213will create a perlish getter/setter.
214
215=item * isa
216
217Takes a coderef which is meant to validate the attribute. Unlike L<Moose> Moo
218does not include a basic type system, so instead of doing C<< isa => 'Num' >>,
219one should do
220
221 isa => quote_sub q{
222 die "$_[0] is not a number!" unless looks_like_number $_[0]
223 },
224
225L<Sub::Quote aware|/SUB QUOTE AWARE>
226
227=item * coerce
228
2e575bcd 229This Moose feature is not yet supported
230
231=begin hide
232
8146585e 233Takes a coderef which is meant to coerce the attribute. The basic idea is to
234do something like the following:
235
236 coerce => quote_sub q{
237 $_[0] + 1 unless $_[0] % 2
238 },
239
240L<Sub::Quote aware|/SUB QUOTE AWARE>
241
2e575bcd 242=end hide
243
8146585e 244=item * trigger
245
246Takes a coderef which will get called any time the attribute is set. Coderef
247will be invoked against the object with the new value as an argument.
248
2e575bcd 249Note that Moose also passes the old value, if any; this feature is not yet
250supported.
251
8146585e 252L<Sub::Quote aware|/SUB QUOTE AWARE>
253
254=item * default
255
2e575bcd 256Takes a coderef which will get called with $self as its only argument
257to populate an attribute if no value is supplied to the constructor - or
258if the attribute is lazy, when the attribute is first retrieved if no
259value has yet been provided.
260
261Note that if your default is fired during new() there is no guarantee that
262other attributes have been populated yet so you should not rely on their
263existence.
8146585e 264
265L<Sub::Quote aware|/SUB QUOTE AWARE>
266
267=item * predicate
268
2e575bcd 269Takes a method name which will return true if an attribute has a value.
8146585e 270
271A common example of this would be to call it C<has_$foo>, implying that the
272object has a C<$foo> set.
273
274=item * builder
275
2e575bcd 276Takes a method name which will be called to create the attribute - functions
277exactly like default except that instead of calling
278
279 $default->($self);
280
281Moo will call
282
283 $self->$builder;
8146585e 284
285=item * clearer
286
287Takes a method name which will clear the attribute.
288
289=item * lazy
290
291B<Boolean>. Set this if you want values for the attribute to be grabbed
292lazily. This is usually a good idea if you have a L</builder> which requires
293another attribute to be set.
294
295=item * required
296
297B<Boolean>. Set this if the attribute must be passed on instantiation.
298
299=item * weak_ref
300
301B<Boolean>. Set this if you want the reference that the attribute contains to
302be weakened; use this when circular references are possible, which will cause
303leaks.
304
305=item * init_arg
306
307Takes the name of the key to look for at instantiation time of the object. A
308common use of this is to make an underscored attribute have a non-underscored
309initialization name. C<undef> means that passing the value in on instantiation
310
311=back
312
313=head2 before
314
315 before foo => sub { ... };
316
317See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
318documentation.
319
320=head2 around
321
322 around foo => sub { ... };
323
324See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
325documentation.
326
327=head2 after
328
329 after foo => sub { ... };
330
331See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
332documentation.
333
8146585e 334=head1 SUB QUOTE AWARE
335
336L<Sub::Quote/quote_sub> allows us to create coderefs that are "inlineable,"
337giving us a handy, XS-free speed boost. Any option that is L<Sub::Quote>
338aware can take advantage of this.
339
2e575bcd 340=head1 INCOMPATIBILITIES WITH MOOSE
8146585e 341
342You can only compose one role at a time. If your application is large or
343complex enough to warrant complex composition, you wanted L<Moose>.
344
345There is no complex type system. C<isa> is verified with a coderef, if you
346need complex types, just make a library of coderefs, or better yet, functions
347that return quoted subs.
348
2e575bcd 349C<initializer> is not supported in core since the author considers it to be a
350bad idea but may be supported by an extension in future.
8146585e 351
352There is no meta object. If you need this level of complexity you wanted
2e575bcd 353L<Moose> - Moo succeeds at being small because it explicitly does not
354provide a metaprotocol.
8146585e 355
2e575bcd 356No support for C<super>, C<override>, C<inner>, or C<augment> - override can
357be handled by around albeit with a little more typing, and the author considers
358augment to be a bad idea.
8146585e 359
360L</default> only supports coderefs, because doing otherwise is usually a
361mistake anyway.
362
363C<lazy_build> is not supported per se, but of course it will work if you
364manually set all the options it implies.
365
2e575bcd 366C<auto_deref> is not supported since the author considers it a bad idea.
8146585e 367
2e575bcd 368C<documentation> is not supported since it's a very poor replacement for POD.