update FAQ on constructor stuff
[gitmo/Moose.git] / lib / Moose / Cookbook / FAQ.pod
CommitLineData
e67a0fca 1
2=pod
3
4=head1 NAME
5
4711f5f7 6Moose::Cookbook::FAQ - Frequently asked questions about Moose
e67a0fca 7
8=head1 FREQUENTLY ASKED QUESTIONS
9
2a0f3bd3 10=head2 Module Stability
11
12=head3 Is Moose "production ready"?
13
004222dc 14Yes. I have several medium-to-large-ish web applications in
734d1752 15production using Moose, they have been running without
004222dc 16issue now for well over a year.
734d1752 17
004222dc 18At C<$work> we are re-writing our core offering to use Moose,
734d1752 19so it's continued development is assured.
20
21Several other people on #moose either have apps in production
22which use Moose, or are in the process of deploying sites
23which use Moose.
2a0f3bd3 24
25=head3 Is Moose's API stable?
26
27Yes and No. The external API, the one 90% of users will interact
28with, is B<very stable> and any changes B<will be 100% backwards
807f6b7c 29compatible>. The introspection API is I<mostly> stable; I still
2a0f3bd3 30reserve the right to tweak that if needed, but I will do my
4711f5f7 31absolute best to maintain backwards compatibility here as well.
2a0f3bd3 32
734d1752 33=head3 I heard Moose is slow, is this true?
2a0f3bd3 34
35Again, this one is tricky, so Yes I<and> No.
36
37First let me say that I<nothing> in life is free, and that some
38Moose features do cost more than others. It is also the
39policy of Moose to B<only charge you for the features you use>,
40and to do our absolute best to not place any extra burdens on
d44714be 41the execution of your code for features you are not using. Of
42course using Moose itself does involve some overhead, but it
43is mostly compile time. At this point we do have some options
44available for getting the speed you need.
2a0f3bd3 45
734d1752 46Currently we have the option of making your classes immutable
004222dc 47as a means of boosting speed. This will mean a slightly larger compile
734d1752 48time cost, but the runtime speed increase (especially in object
4711f5f7 49construction) is pretty significant. This is not very well
807f6b7c 50documented yet, so please ask on the list or on #moose for more
d44714be 51information.
52
807f6b7c 53We are also discussing and experimenting with L<Module::Compile>,
54and the idea of compiling highly optimized C<.pmc> files. In
55addition, we have mapped out some core methods as candidates for
56conversion to XS.
2a0f3bd3 57
807f6b7c 58=head3 When will Moose 1.0 be ready?
2a0f3bd3 59
004222dc 60It is right now, I declared 0.18 to be "ready to use".
2a0f3bd3 61
e67a0fca 62=head2 Constructors
63
64=head3 How do I write custom constructors with Moose?
65
66Ideally, you should never write your own C<new> method, and should
67use Moose's other features to handle your specific object construction
68needs. Here are a few scenarios, and the Moose way to solve them;
69
4711f5f7 70If you need to call initialization code post instance construction,
e67a0fca 71then use the C<BUILD> method. This feature is taken directly from
4711f5f7 72Perl 6. Every C<BUILD> method in your inheritance chain is called
e67a0fca 73(in the correct order) immediately after the instance is constructed.
74This allows you to ensure that all your superclasses are initialized
75properly as well. This is the best approach to take (when possible)
4711f5f7 76because it makes sub classing your class much easier.
e67a0fca 77
78If you need to affect the constructor's parameters prior to the
79instance actually being constructed, you have a number of options.
80
81First, there are I<coercions> (See the L<Moose::Cookbook::Recipe5>
82for a complete example and explaination of coercions). With
83coercions it is possible to morph argument values into the correct
84expected types. This approach is the most flexible and robust, but
85does have a slightly higher learning curve.
86
87Second, using an C<around> method modifier on C<new> can be an
88effective way to affect the contents of C<@_> prior to letting
89Moose deal with it. This carries with it the extra burden for
90your subclasses, in that they have to be sure to explicitly
91call your C<new> and/or work around your C<new> to get to the
92version from L<Moose::Object>.
93
94The last approach is to use the standard Perl technique of calling
807f6b7c 95the C<SUPER::new> within your own custom version of C<new>. This,
96of course, brings with it all the issues of the C<around> solution
97as well as any issues C<SUPER::> might add.
e67a0fca 98
99In short, try to use C<BUILD> and coercions, they are your best
100bets.
101
4711f5f7 102=head3 How do I make non-Moose constructors work with Moose?
e67a0fca 103
e760b278 104Usually the correct approach to subclassing a non Moose class is
105delegation. Moose makes this easy using the C<handles> keyword,
106coercions, and C<lazy_build>, so subclassing is often not the
107ideal route.
108
109That said, the default Moose constructors is inherited from
110L<Moose::Object>. When inheriting from a non-Moose class, the
111inheritance chain to L<Moose::Object> is broken. The simplest way
112to fix this is to simply explicitly inherit from L<Moose::Object>
113yourself.
114
115However, this does not always fix the issue of actually calling the Moose
116constructor. Fortunately L<Class::MOP::Class/new_object>, the low level
117constructor, accepts the special C<__INSTANCE__> parameter, allowing you to
118instantiate your Moose attributes:
e67a0fca 119
120 package My::HTML::Template;
121 use Moose;
122
4711f5f7 123 # explicit inheritance
e67a0fca 124 extends 'HTML::Template', 'Moose::Object';
125
126 # explicit constructor
127 sub new {
128 my $class = shift;
129 # call HTML::Template's constructor
130 my $obj = $class->SUPER::new(@_);
131 return $class->meta->new_object(
132 # pass in the constructed object
133 # using the special key __INSTANCE__
e760b278 134 __INSTANCE__ => $obj,
135 @_, # pass in the normal args
e67a0fca 136 );
137 }
138
807f6b7c 139Of course, this only works if both your Moose class and the
e67a0fca 140inherited non-Moose class use the same instance type (typically
e760b278 141HASH refs).
142
143Note that this doesn't call C<BUILDALL> automatically, you must do that
144yourself.
e67a0fca 145
146Other techniques can be used as well, such as creating the object
147using C<Moose::Object::new>, but calling the inherited non-Moose
4711f5f7 148class's initialization methods (if available).
e67a0fca 149
807f6b7c 150It is also entirely possible to just rely on HASH autovivification
151to create the slots needed for Moose based attributes, although this
152does restrict use of construction time attribute features somewhat.
e67a0fca 153
154In short, there are several ways to go about this, it is best to
155evaluate each case based on the class you wish to extend, and the
156features you wish to employ. As always, both IRC and the mailing
157list are great ways to get help finding the best approach.
158
159=head2 Accessors
160
161=head3 How do I tell Moose to use get/set accessors?
162
163The easiest way to accomplish this is to use the C<reader> and
164C<writer> attribute options. Here is some example code:
165
166 has 'bar' => (
167 isa => 'Baz',
168 reader => 'get_bar',
169 writer => 'set_bar',
170 );
171
172Moose will still take advantage of type constraints, triggers, etc.
173when creating these methods.
174
807f6b7c 175If you do not like this much typing, and wish it to be a default for
176your class, please see L<Moose::Policy>, and more specifically
177L<Moose::Policy::FollowPBP>. This will allow you to write:
e67a0fca 178
179 has 'bar' => (
180 isa => 'Baz',
181 is => 'rw',
182 );
183
807f6b7c 184And have Moose create seperate C<get_bar> and C<set_bar> methods
185instead of a single C<bar> method.
e67a0fca 186
807f6b7c 187NOTE: This B<cannot> be set globally in Moose, as that would break
e67a0fca 188other classes which are built with Moose.
189
190=head3 How can I get Moose to inflate/deflate values in the accessor?
191
192Well, the first question to ask is if you actually need both inflate
193and deflate.
194
195If you only need to inflate, then I suggest using coercions. Here is
807f6b7c 196some basic sample code for inflating a L<DateTime> object:
e67a0fca 197
198 subtype 'DateTime'
199 => as 'Object'
200 => where { $_->isa('DateTime') };
201
202 coerce 'DateTime'
203 => from 'Str'
204 => via { DateTime::Format::MySQL->parse_datetime($_) };
205
206 has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
207
208This creates a custom subtype for L<DateTime> objects, then attaches
209a coercion to that subtype. The C<timestamp> attribute is then told
807f6b7c 210to expect a C<DateTime> type, and to try to coerce it. When a C<Str>
e67a0fca 211type is given to the C<timestamp> accessor, it will attempt to
212coerce the value into a C<DateTime> object using the code in found
213in the C<via> block.
214
807f6b7c 215For a more comprehensive example of using coercions, see the
e67a0fca 216L<Moose::Cookbook::Recipe5>.
217
218If you need to deflate your attribute, the current best practice is to
219add an C<around> modifier to your accessor. Here is some example code:
220
221 # a timestamp which stores as
222 # seconds from the epoch
223 has 'timestamp' => (is => 'rw', isa => 'Int');
224
225 around 'timestamp' => sub {
226 my $next = shift;
227 my ($self, $timestamp) = @_;
228 # assume we get a DateTime object ...
229 $next->($self, $timestamp->epoch);
230 };
231
232It is also possible to do deflation using coercion, but this tends
233to get quite complex and require many subtypes. An example of this
234is outside the scope of this document, ask on #moose or send a mail
235to the list.
236
237Still another option is to write a custom attribute metaclass, which
238is also outside the scope of this document, but I would be happy to
239explain it on #moose or the mailing list.
240
4711f5f7 241=head2 Method Modifiers
e67a0fca 242
243=head3 How can I affect the values in C<@_> using C<before>?
244
807f6b7c 245You can't, actually: C<before> only runs before the main method,
246and it cannot easily affect the method's execution. What you want is
e67a0fca 247an C<around> method.
248
249=head3 Can I use C<before> to stop execution of a method?
250
251Yes, but only if you throw an exception. If this is too drastic a
252measure then I suggest using C<around> instead. The C<around> method
807f6b7c 253modifier is the only modifier which can gracefully prevent execution
e67a0fca 254of the main method. Here is an example:
255
256 around 'baz' => sub {
257 my $next = shift;
258 my ($self, %options) = @_;
807f6b7c 259 unless ($options->{bar} eq 'foo') {
260 return 'bar';
e67a0fca 261 }
807f6b7c 262 $next->($self, %options);
e67a0fca 263 };
264
265By choosing not to call the C<$next> method, you can stop the
266execution of the main method.
267
268=head2 Type Constraints
269
270=head3 How can I have a custom error message for a type constraint?
271
807f6b7c 272Use the C<message> option when building the subtype, like so:
e67a0fca 273
274 subtype 'NaturalLessThanTen'
275 => as 'Natural'
276 => where { $_ < 10 }
277 => message { "This number ($_) is not less than ten!" };
278
279This will be called when a value fails to pass the C<NaturalLessThanTen>
280constraint check.
281
807f6b7c 282=head3 Can I turn off type constraint checking?
734d1752 283
284Not yet, but soon. This option will likely be coming in the next
285release.
286
b36c8076 287=head2 Roles
288
289=head3 How do I get Moose to call BUILD in all my composed roles?
290
291See L<Moose::Cookbook::WTF> and specifically the B<How come BUILD
292is not called for my composed roles?> question in the B<Roles> section.
293
e67a0fca 294=head1 AUTHOR
295
296Stevan Little E<lt>stevan@iinteractive.comE<gt>
297
298=head1 COPYRIGHT AND LICENSE
299
778db3ac 300Copyright 2006-2008 by Infinity Interactive, Inc.
e67a0fca 301
302L<http://www.iinteractive.com>
303
304This library is free software; you can redistribute it and/or modify
305it under the same terms as Perl itself.
306
e760b278 307=cut