6 Moose::Cookbook::FAQ - Frequenty asked questions about Moose
8 =head1 FREQUENTLY ASKED QUESTIONS
10 =head2 Module Stability
12 =head3 Is Moose "production ready"?
14 Yes. I have two medium-to-large-ish web applications in
15 production using Moose, they have been running without
16 issue now for almost a year.
18 At $work we are re-writing our core offering to use Moose,
19 so it's continued development is assured.
21 Several other people on #moose either have apps in production
22 which use Moose, or are in the process of deploying sites
25 =head3 Is Moose's API stable?
27 Yes and No. The external API, the one 90% of users will interact
28 with, is B<very stable> and any changes B<will be 100% backwards
29 compatible>. The introspection API is I<mostly> stable, I still
30 reserve the right to tweak that if needed, but I will do my
31 absolute best to maintain backwards comptability here as well.
33 =head3 I heard Moose is slow, is this true?
35 Again, this one is tricky, so Yes I<and> No.
37 First let me say that I<nothing> in life is free, and that some
38 Moose features do cost more than others. It is also the
39 policy of Moose to B<only charge you for the features you use>,
40 and to do our absolute best to not place any extra burdens on
41 the execution of your code for features you are not using.
43 Next, I will point out again that we are still in the "early
44 adopter" phase, so speed it not that important yet. We are
45 actually optimizing for "theoretical correctness" first, and
46 we will optimize for speed later. It has been our experience
47 that taking this approach allows for greater optimization
50 Currently we have the option of making your classes immutable
51 as a means of boosting speed. This will mean a larger compile
52 time cost, but the runtime speed increase (especially in object
53 construction) is pretty signifigant.
55 This is not all either, we are also discussing and experimenting
56 with L<Module::Compile>, and the idea of compiling highly
57 optimized C<.pmc> files. And we have also mapped out some core
58 methods as canidates for conversion to XS.
60 =head3 When will Moose be 1.0 ready?
62 I had originally said it would be end of 2006, but various bits
63 of $work kept me too busy. At this point, I think we are getting
64 pretty close and I will likely declare 1.0 within the next few
67 When will that be? Hard to say really, but honestly, it is ready
68 to use now, the difference between now and 1.0 will be pretty
73 =head3 How do I write custom constructors with Moose?
75 Ideally, you should never write your own C<new> method, and should
76 use Moose's other features to handle your specific object construction
77 needs. Here are a few scenarios, and the Moose way to solve them;
79 If you need to call initializtion code post instance construction,
80 then use the C<BUILD> method. This feature is taken directly from
81 Perl 6. Every C<BUILD> method in your inheritence chain is called
82 (in the correct order) immediately after the instance is constructed.
83 This allows you to ensure that all your superclasses are initialized
84 properly as well. This is the best approach to take (when possible)
85 because it makes subclassing your class much easier.
87 If you need to affect the constructor's parameters prior to the
88 instance actually being constructed, you have a number of options.
90 First, there are I<coercions> (See the L<Moose::Cookbook::Recipe5>
91 for a complete example and explaination of coercions). With
92 coercions it is possible to morph argument values into the correct
93 expected types. This approach is the most flexible and robust, but
94 does have a slightly higher learning curve.
96 Second, using an C<around> method modifier on C<new> can be an
97 effective way to affect the contents of C<@_> prior to letting
98 Moose deal with it. This carries with it the extra burden for
99 your subclasses, in that they have to be sure to explicitly
100 call your C<new> and/or work around your C<new> to get to the
101 version from L<Moose::Object>.
103 The last approach is to use the standard Perl technique of calling
104 the C<SUPER::new> within your own custom version of C<new>. This
105 of course brings with it all the issues of the C<around> solution
106 along with any issues C<SUPER::> might add as well.
108 In short, try to use C<BUILD> and coercions, they are your best
111 =head3 How do I make non-Moose constuctors work with Moose?
113 Moose provides it's own constructor, but it does it by making all
114 Moose-based classes inherit from L<Moose::Object>. When inheriting
115 from a non-Moose class, the inheritence chain to L<Moose::Object>
116 is broken. The simplest way to fix this is to simply explicitly
117 inherit from L<Moose::Object> yourself. However, this does not
118 always fix the issue of a constructor. Here is a basic example of
119 how this can be worked around:
121 package My::HTML::Template;
124 # explict inheritence
125 extends 'HTML::Template', 'Moose::Object';
127 # explicit constructor
130 # call HTML::Template's constructor
131 my $obj = $class->SUPER::new(@_);
132 return $class->meta->new_object(
133 # pass in the constructed object
134 # using the special key __INSTANCE__
135 __INSTANCE__ => $obj, @_
139 Of course this only works if both your Moose class, and the
140 inherited non-Moose class use the same instance type (typically
143 Other techniques can be used as well, such as creating the object
144 using C<Moose::Object::new>, but calling the inherited non-Moose
145 class's initializtion methods (if available).
147 It is also entirely possible to just rely on HASH autovivification
148 to create the slot's needed for Moose based attributes. Although
149 this does somewhat restrict use of construction time attribute
152 In short, there are several ways to go about this, it is best to
153 evaluate each case based on the class you wish to extend, and the
154 features you wish to employ. As always, both IRC and the mailing
155 list are great ways to get help finding the best approach.
159 =head3 How do I tell Moose to use get/set accessors?
161 The easiest way to accomplish this is to use the C<reader> and
162 C<writer> attribute options. Here is some example code:
170 Moose will still take advantage of type constraints, triggers, etc.
171 when creating these methods.
173 If you do not like this much typing, and wish it to be a default for
174 your class. Please see L<Moose::Policy>, and more specifically the
175 L<Moose::Policy::FollowPBP>. This will allow you to write this:
182 And have Moose create C<get_bar> and C<set_bar> instead of the usual
185 NOTE: This B<cannot> be set globally in Moose, as this would break
186 other classes which are built with Moose.
188 =head3 How can I get Moose to inflate/deflate values in the accessor?
190 Well, the first question to ask is if you actually need both inflate
193 If you only need to inflate, then I suggest using coercions. Here is
194 some basic sample code for inflating a L<DateTime> object.
198 => where { $_->isa('DateTime') };
202 => via { DateTime::Format::MySQL->parse_datetime($_) };
204 has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
206 This creates a custom subtype for L<DateTime> objects, then attaches
207 a coercion to that subtype. The C<timestamp> attribute is then told
208 to expect a C<DateTime> type, and to try and coerce it. When a C<Str>
209 type is given to the C<timestamp> accessor, it will attempt to
210 coerce the value into a C<DateTime> object using the code in found
213 For a more detailed and complete example of coercions, see the
214 L<Moose::Cookbook::Recipe5>.
216 If you need to deflate your attribute, the current best practice is to
217 add an C<around> modifier to your accessor. Here is some example code:
219 # a timestamp which stores as
220 # seconds from the epoch
221 has 'timestamp' => (is => 'rw', isa => 'Int');
223 around 'timestamp' => sub {
225 my ($self, $timestamp) = @_;
226 # assume we get a DateTime object ...
227 $next->($self, $timestamp->epoch);
230 It is also possible to do deflation using coercion, but this tends
231 to get quite complex and require many subtypes. An example of this
232 is outside the scope of this document, ask on #moose or send a mail
235 Still another option is to write a custom attribute metaclass, which
236 is also outside the scope of this document, but I would be happy to
237 explain it on #moose or the mailing list.
239 =head2 Method Modfiers
241 =head3 How can I affect the values in C<@_> using C<before>?
243 You can't actually, C<before> only runs before the main method,
244 and it cannot easily affect the execution of it. What you want is
247 =head3 Can I use C<before> to stop execution of a method?
249 Yes, but only if you throw an exception. If this is too drastic a
250 measure then I suggest using C<around> instead. The C<around> method
251 modifier is the only modifier which can actually stop the execution
252 of the main method. Here is an example:
254 around 'baz' => sub {
256 my ($self, %options) = @_;
257 if ($options{bar} eq 'foo') {
258 $next->($self, %options);
265 By choosing not to call the C<$next> method, you can stop the
266 execution of the main method.
268 =head2 Type Constraints
270 =head3 How can I have a custom error message for a type constraint?
272 Use the C<message> option when building the subtype. Like so:
274 subtype 'NaturalLessThanTen'
277 => message { "This number ($_) is not less than ten!" };
279 This will be called when a value fails to pass the C<NaturalLessThanTen>
282 =head3 Can I turn type constraint checking off?
284 Not yet, but soon. This option will likely be coming in the next
289 Stevan Little E<lt>stevan@iinteractive.comE<gt>
291 =head1 COPYRIGHT AND LICENSE
293 Copyright 2006, 2007 by Infinity Interactive, Inc.
295 L<http://www.iinteractive.com>
297 This library is free software; you can redistribute it and/or modify
298 it under the same terms as Perl itself.