6 Moose::Cookbook::FAQ - Frequently asked questions about Moose
8 =head1 FREQUENTLY ASKED QUESTIONS
10 =head2 Module Stability
12 =head3 Is Moose "production ready"?
14 Yes. I have several medium-to-large-ish web applications in
15 production using Moose, they have been running without
16 issue now for well over a year.
18 At C<$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 compatibility 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. Of
42 course using Moose itself does involve some overhead, but it
43 is mostly compile time. At this point we do have some options
44 available for getting the speed you need.
46 Currently we have the option of making your classes immutable
47 as a means of boosting speed. This will mean a slightly larger compile
48 time cost, but the runtime speed increase (especially in object
49 construction) is pretty significant. This is not very well
50 documented yet, so please ask on the list or on #moose for more
53 We are also discussing and experimenting with L<Module::Compile>,
54 and the idea of compiling highly optimized C<.pmc> files. In
55 addition, we have mapped out some core methods as candidates for
58 =head3 When will Moose 1.0 be ready?
60 It is right now, I declared 0.18 to be "ready to use".
64 =head3 How do I write custom constructors with Moose?
66 Ideally, you should never write your own C<new> method, and should
67 use Moose's other features to handle your specific object construction
68 needs. Here are a few scenarios, and the Moose way to solve them;
70 If you need to call initialization code post instance construction,
71 then use the C<BUILD> method. This feature is taken directly from
72 Perl 6. Every C<BUILD> method in your inheritance chain is called
73 (in the correct order) immediately after the instance is constructed.
74 This allows you to ensure that all your superclasses are initialized
75 properly as well. This is the best approach to take (when possible)
76 because it makes sub classing your class much easier.
78 If you need to affect the constructor's parameters prior to the
79 instance actually being constructed, you have a number of options.
81 First, there are I<coercions> (See the L<Moose::Cookbook::Recipe5>
82 for a complete example and explaination of coercions). With
83 coercions it is possible to morph argument values into the correct
84 expected types. This approach is the most flexible and robust, but
85 does have a slightly higher learning curve.
87 Second, using an C<around> method modifier on C<new> can be an
88 effective way to affect the contents of C<@_> prior to letting
89 Moose deal with it. This carries with it the extra burden for
90 your subclasses, in that they have to be sure to explicitly
91 call your C<new> and/or work around your C<new> to get to the
92 version from L<Moose::Object>.
94 The last approach is to use the standard Perl technique of calling
95 the C<SUPER::new> within your own custom version of C<new>. This,
96 of course, brings with it all the issues of the C<around> solution
97 as well as any issues C<SUPER::> might add.
99 In short, try to use C<BUILD> and coercions, they are your best
102 =head3 How do I make non-Moose constructors work with Moose?
104 Moose provides its own constructor, but it does it by making all
105 Moose-based classes inherit from L<Moose::Object>. When inheriting
106 from a non-Moose class, the inheritance chain to L<Moose::Object>
107 is broken. The simplest way to fix this is to simply explicitly
108 inherit from L<Moose::Object> yourself. However, this does not
109 always fix the issue of a constructor. Here is a basic example of
110 how this can be worked around:
112 package My::HTML::Template;
115 # explicit inheritance
116 extends 'HTML::Template', 'Moose::Object';
118 # explicit constructor
121 # call HTML::Template's constructor
122 my $obj = $class->SUPER::new(@_);
123 return $class->meta->new_object(
124 # pass in the constructed object
125 # using the special key __INSTANCE__
126 __INSTANCE__ => $obj, @_
130 Of course, this only works if both your Moose class and the
131 inherited non-Moose class use the same instance type (typically
134 Other techniques can be used as well, such as creating the object
135 using C<Moose::Object::new>, but calling the inherited non-Moose
136 class's initialization methods (if available).
138 It is also entirely possible to just rely on HASH autovivification
139 to create the slots needed for Moose based attributes, although this
140 does restrict use of construction time attribute features somewhat.
142 In short, there are several ways to go about this, it is best to
143 evaluate each case based on the class you wish to extend, and the
144 features you wish to employ. As always, both IRC and the mailing
145 list are great ways to get help finding the best approach.
149 =head3 How do I tell Moose to use get/set accessors?
151 The easiest way to accomplish this is to use the C<reader> and
152 C<writer> attribute options. Here is some example code:
160 Moose will still take advantage of type constraints, triggers, etc.
161 when creating these methods.
163 If you do not like this much typing, and wish it to be a default for
164 your class, please see L<Moose::Policy>, and more specifically
165 L<Moose::Policy::FollowPBP>. This will allow you to write:
172 And have Moose create seperate C<get_bar> and C<set_bar> methods
173 instead of a single C<bar> method.
175 NOTE: This B<cannot> be set globally in Moose, as that would break
176 other classes which are built with Moose.
178 =head3 How can I get Moose to inflate/deflate values in the accessor?
180 Well, the first question to ask is if you actually need both inflate
183 If you only need to inflate, then I suggest using coercions. Here is
184 some basic sample code for inflating a L<DateTime> object:
188 => where { $_->isa('DateTime') };
192 => via { DateTime::Format::MySQL->parse_datetime($_) };
194 has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
196 This creates a custom subtype for L<DateTime> objects, then attaches
197 a coercion to that subtype. The C<timestamp> attribute is then told
198 to expect a C<DateTime> type, and to try to coerce it. When a C<Str>
199 type is given to the C<timestamp> accessor, it will attempt to
200 coerce the value into a C<DateTime> object using the code in found
203 For a more comprehensive example of using coercions, see the
204 L<Moose::Cookbook::Recipe5>.
206 If you need to deflate your attribute, the current best practice is to
207 add an C<around> modifier to your accessor. Here is some example code:
209 # a timestamp which stores as
210 # seconds from the epoch
211 has 'timestamp' => (is => 'rw', isa => 'Int');
213 around 'timestamp' => sub {
215 my ($self, $timestamp) = @_;
216 # assume we get a DateTime object ...
217 $next->($self, $timestamp->epoch);
220 It is also possible to do deflation using coercion, but this tends
221 to get quite complex and require many subtypes. An example of this
222 is outside the scope of this document, ask on #moose or send a mail
225 Still another option is to write a custom attribute metaclass, which
226 is also outside the scope of this document, but I would be happy to
227 explain it on #moose or the mailing list.
229 =head2 Method Modifiers
231 =head3 How can I affect the values in C<@_> using C<before>?
233 You can't, actually: C<before> only runs before the main method,
234 and it cannot easily affect the method's execution. What you want is
237 =head3 Can I use C<before> to stop execution of a method?
239 Yes, but only if you throw an exception. If this is too drastic a
240 measure then I suggest using C<around> instead. The C<around> method
241 modifier is the only modifier which can gracefully prevent execution
242 of the main method. Here is an example:
244 around 'baz' => sub {
246 my ($self, %options) = @_;
247 unless ($options->{bar} eq 'foo') {
250 $next->($self, %options);
253 By choosing not to call the C<$next> method, you can stop the
254 execution of the main method.
256 =head2 Type Constraints
258 =head3 How can I have a custom error message for a type constraint?
260 Use the C<message> option when building the subtype, like so:
262 subtype 'NaturalLessThanTen'
265 => message { "This number ($_) is not less than ten!" };
267 This will be called when a value fails to pass the C<NaturalLessThanTen>
270 =head3 Can I turn off type constraint checking?
272 Not yet, but soon. This option will likely be coming in the next
277 =head3 How do I get Moose to call BUILD in all my composed roles?
279 See L<Moose::Cookbook::WTF> and specifically the B<How come BUILD
280 is not called for my composed roles?> question in the B<Roles> section.
284 Stevan Little E<lt>stevan@iinteractive.comE<gt>
286 =head1 COPYRIGHT AND LICENSE
288 Copyright 2006-2008 by Infinity Interactive, Inc.
290 L<http://www.iinteractive.com>
292 This library is free software; you can redistribute it and/or modify
293 it under the same terms as Perl itself.