test with Test::Deep::eq_deeply
[gitmo/Moose.git] / lib / Moose / Cookbook / FAQ.pod
1
2 =pod
3
4 =head1 NAME
5
6 Moose::Cookbook::FAQ - Frequenty asked questions about Moose
7
8 =head1 FREQUENTLY ASKED QUESTIONS
9
10 =head2 Module Stability
11
12 =head3 Is Moose "production ready"?
13
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. 
17
18 At $work we are re-writing our core offering to use Moose, 
19 so it's continued development is assured. 
20
21 Several other people on #moose either have apps in production 
22 which use Moose, or are in the process of deploying sites 
23 which use Moose. 
24
25 =head3 Is Moose's API stable?
26
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.
32
33 =head3 I heard Moose is slow, is this true?
34
35 Again, this one is tricky, so Yes I<and> No.
36
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. 
42
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 
48 capacity. 
49
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. 
54
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. 
59
60 =head3 When will Moose be 1.0 ready?
61
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 
65 releases. 
66
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 
69 minimal.
70
71 =head2 Constructors
72
73 =head3 How do I write custom constructors with Moose?
74
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;
78
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.
86
87 If you need to affect the constructor's parameters prior to the 
88 instance actually being constructed, you have a number of options.
89
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.
95
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>. 
102
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.
107
108 In short, try to use C<BUILD> and coercions, they are your best 
109 bets.
110
111 =head3 How do I make non-Moose constuctors work with Moose? 
112
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:
120
121   package My::HTML::Template;
122   use Moose;
123   
124   # explict inheritence 
125   extends 'HTML::Template', 'Moose::Object';
126   
127   # explicit constructor
128   sub new {
129       my $class = shift;
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, @_
136       );
137   }
138
139 Of course this only works if both your Moose class, and the 
140 inherited non-Moose class use the same instance type (typically 
141 HASH refs). 
142
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). 
146
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 
150 features.
151
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.
156
157 =head2 Accessors
158
159 =head3 How do I tell Moose to use get/set accessors?
160
161 The easiest way to accomplish this is to use the C<reader> and 
162 C<writer> attribute options. Here is some example code:
163
164   has 'bar' => (
165       isa    => 'Baz',
166       reader => 'get_bar', 
167       writer => 'set_bar',
168   );
169
170 Moose will still take advantage of type constraints, triggers, etc. 
171 when creating these methods. 
172
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:
176
177   has 'bar' => (
178       isa => 'Baz',
179       is  => 'rw',
180   );
181
182 And have Moose create C<get_bar> and C<set_bar> instead of the usual 
183 C<bar>.
184
185 NOTE: This B<cannot> be set globally in Moose, as this would break 
186 other classes which are built with Moose.
187
188 =head3 How can I get Moose to inflate/deflate values in the accessor?
189
190 Well, the first question to ask is if you actually need both inflate 
191 and deflate.
192
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. 
195
196   subtype 'DateTime'
197       => as 'Object'
198       => where { $_->isa('DateTime') };
199       
200   coerce 'DateTime'
201       => from 'Str'
202         => via { DateTime::Format::MySQL->parse_datetime($_) };
203         
204   has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
205
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 
211 in the C<via> block. 
212
213 For a more detailed and complete example of coercions, see the 
214 L<Moose::Cookbook::Recipe5>.
215
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:
218
219   # a timestamp which stores as 
220   # seconds from the epoch
221   has 'timestamp' => (is => 'rw', isa => 'Int');
222   
223   around 'timestamp' => sub {
224       my $next = shift;
225       my ($self, $timestamp) = @_;
226       # assume we get a DateTime object ...
227       $next->($self, $timestamp->epoch);
228   };
229
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 
233 to the list.
234
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.
238
239 =head2 Method Modfiers
240
241 =head3 How can I affect the values in C<@_> using C<before>?
242
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 
245 an C<around> method. 
246
247 =head3 Can I use C<before> to stop execution of a method?
248
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:
253
254   around 'baz' => sub {
255       my $next = shift;
256       my ($self, %options) = @_;
257       if ($options{bar} eq 'foo') {
258           $next->($self, %options);
259       }
260       else {
261           return 'bar';
262       }
263   };
264
265 By choosing not to call the C<$next> method, you can stop the 
266 execution 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
272 Use the C<message> option when building the subtype. Like so:
273
274   subtype 'NaturalLessThanTen' 
275       => as 'Natural'
276       => where { $_ < 10 }
277       => message { "This number ($_) is not less than ten!" };
278
279 This will be called when a value fails to pass the C<NaturalLessThanTen>
280 constraint check. 
281
282 =head3 Can I turn type constraint checking off?
283
284 Not yet, but soon. This option will likely be coming in the next 
285 release.
286
287 =head1 AUTHOR
288
289 Stevan Little E<lt>stevan@iinteractive.comE<gt>
290
291 =head1 COPYRIGHT AND LICENSE
292
293 Copyright 2006, 2007 by Infinity Interactive, Inc.
294
295 L<http://www.iinteractive.com>
296
297 This library is free software; you can redistribute it and/or modify
298 it under the same terms as Perl itself.
299
300 =cut