Remove $next->($self, ...) in favor of $self->$next(...)
[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
2222bdc4 14Yes! Many sites with household names are using Moose to build
15high-traffic services. Countless others are using Moose in
16production.
734d1752 17
2222bdc4 18As of this writing, Moose is a dependency of several hundred CPAN
19modules. L<http://cpants.perl.org/dist/used_by/Moose>
2a0f3bd3 20
21=head3 Is Moose's API stable?
22
c698114d 23Yes. The sugary API, the one 95% of users will interact with, is
24B<very stable>. Any changes will be B<100% backwards compatible>.
25
26The meta API is less set in stone. We reserve the right to tweak
27parts of it to improve efficiency or consistency. This will not be
28done lightly. We do perform deprecation cycles. We I<really>
29do not like making ourselves look bad by breaking your code.
30Submitting test cases is the best way to ensure that your code is not
31inadvertantly broken by refactoring.
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
c32ff715 37Firstly, I<nothing> in life is free, and some Moose features
38do cost more than others. It is also the policy of Moose to
39B<only charge you for the features you use>, and to do our
40absolute best to not place any extra burdens on the execution
41of your code for features you are not using. Of course using
42Moose itself does involve some overhead, but it is mostly
43compile time. At this point we do have some options available
44for getting the speed you need.
45
46Currently we provide the option of making your classes immutable
d03bd989 47as a means of boosting speed. This will mean a slightly larger compile
734d1752 48time cost, but the runtime speed increase (especially in object
c32ff715 49construction) is pretty significant.
50
51We are regularly converting the hotspots of L<Class::MOP> to XS.
52Florian Ragwitz and Yuval Kogman are currently working on a way
53to compile your accessors and instances directly into C, so that
54everyone can enjoy blazing fast OO.
2a0f3bd3 55
807f6b7c 56=head3 When will Moose 1.0 be ready?
2a0f3bd3 57
37a9448b 58Moose is ready now! Stevan Little declared 0.18, released in March 2007,
afc402d9 59to be "ready to use".
2a0f3bd3 60
e67a0fca 61=head2 Constructors
62
63=head3 How do I write custom constructors with Moose?
64
65Ideally, you should never write your own C<new> method, and should
66use Moose's other features to handle your specific object construction
67needs. Here are a few scenarios, and the Moose way to solve them;
68
d03bd989 69If you need to call initialization code post instance construction,
70then use the C<BUILD> method. This feature is taken directly from
71Perl 6. Every C<BUILD> method in your inheritance chain is called
72(in the correct order) immediately after the instance is constructed.
73This allows you to ensure that all your superclasses are initialized
e67a0fca 74properly as well. This is the best approach to take (when possible)
dab94063 75because it makes subclassing your class much easier.
e67a0fca 76
d03bd989 77If you need to affect the constructor's parameters prior to the
e67a0fca 78instance actually being constructed, you have a number of options.
79
ce21ecc5 80To change the parameter processing as a whole, you can use
81the C<BUILDARGS> method. The default implementation accepts key/value
82pairs or a hash reference. You can override it to take positional args,
83or any other format
84
85To change the handling of individual parameters, there are I<coercions>
5cfe3805 86(See the L<Moose::Cookbook::Basics::Recipe5> for a complete example and
a8de15f8 87explanation of coercions). With coercions it is possible to morph
ce21ecc5 88argument values into the correct expected types. This approach is the
89most flexible and robust, but does have a slightly higher learning
90curve.
e67a0fca 91
d03bd989 92=head3 How do I make non-Moose constructors work with Moose?
e67a0fca 93
6c17df8f 94Usually the correct approach to subclassing a non-Moose class is
e760b278 95delegation. Moose makes this easy using the C<handles> keyword,
96coercions, and C<lazy_build>, so subclassing is often not the
97ideal route.
98
fe4975b3 99That said, if you really need to inherit from a non-Moose class, see
100L<Moose::Cookbook::Basics::Recipe12> for an example of how to do it.
e67a0fca 101
102=head2 Accessors
103
104=head3 How do I tell Moose to use get/set accessors?
105
d03bd989 106The easiest way to accomplish this is to use the C<reader> and
6c17df8f 107C<writer> attribute options:
e67a0fca 108
109 has 'bar' => (
110 isa => 'Baz',
d03bd989 111 reader => 'get_bar',
e67a0fca 112 writer => 'set_bar',
113 );
114
d03bd989 115Moose will still take advantage of type constraints, triggers, etc.
116when creating these methods.
e67a0fca 117
1a835594 118If you do not like this much typing, and wish it to be a default for your
6c17df8f 119classes, please see L<MooseX::FollowPBP>. This extension will allow you to
120write:
e67a0fca 121
122 has 'bar' => (
123 isa => 'Baz',
124 is => 'rw',
125 );
126
6c17df8f 127Moose will create separate C<get_bar> and C<set_bar> methods
807f6b7c 128instead of a single C<bar> method.
e67a0fca 129
d03bd989 130NOTE: This B<cannot> be set globally in Moose, as that would break
6c17df8f 131other classes which are built with Moose. You can still save on typing
132by defining a new L<MyApp::Moose> that exports Moose's sugar and then
133turns on L<MooseX::FollowPBP>. See L<Moose::Cookbook::Extending::Recipe4>.
e67a0fca 134
6c17df8f 135=head3 How can I inflate/deflate values in accessors?
e67a0fca 136
d03bd989 137Well, the first question to ask is if you actually need both inflate
e67a0fca 138and deflate.
139
8b870d0e 140If you only need to inflate, then we suggest using coercions. Here is
807f6b7c 141some basic sample code for inflating a L<DateTime> object:
e67a0fca 142
6c17df8f 143 class_type 'DateTime';
d03bd989 144
e67a0fca 145 coerce 'DateTime'
146 => from 'Str'
d8e332d5 147 => via { DateTime::Format::MySQL->parse_datetime($_) };
d03bd989 148
e67a0fca 149 has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
150
6c17df8f 151This creates a custom type for L<DateTime> objects, then attaches
152a coercion to that type. The C<timestamp> attribute is then told
807f6b7c 153to expect a C<DateTime> type, and to try to coerce it. When a C<Str>
d03bd989 154type is given to the C<timestamp> accessor, it will attempt to
155coerce the value into a C<DateTime> object using the code in found
156in the C<via> block.
e67a0fca 157
807f6b7c 158For a more comprehensive example of using coercions, see the
5cfe3805 159L<Moose::Cookbook::Basics::Recipe5>.
e67a0fca 160
6c17df8f 161If you need to deflate your attribute's value, the current best practice
162is to add an C<around> modifier to your accessor:
e67a0fca 163
d03bd989 164 # a timestamp which stores as
e67a0fca 165 # seconds from the epoch
166 has 'timestamp' => (is => 'rw', isa => 'Int');
d03bd989 167
e67a0fca 168 around 'timestamp' => sub {
169 my $next = shift;
24d8fc0d 170 my $self = shift;
171
172 return $self->$next unless @_;
173
e67a0fca 174 # assume we get a DateTime object ...
24d8fc0d 175 my $timestamp = shift;
176 return $self->$next( $timestamp->epoch );
e67a0fca 177 };
178
d03bd989 179It is also possible to do deflation using coercion, but this tends
180to get quite complex and require many subtypes. An example of this
181is outside the scope of this document, ask on #moose or send a mail
e67a0fca 182to the list.
183
d03bd989 184Still another option is to write a custom attribute metaclass, which
8b870d0e 185is also outside the scope of this document, but we would be happy to
e67a0fca 186explain it on #moose or the mailing list.
187
4711f5f7 188=head2 Method Modifiers
e67a0fca 189
190=head3 How can I affect the values in C<@_> using C<before>?
191
d03bd989 192You can't, actually: C<before> only runs before the main method,
e30e57c6 193and it cannot easily affect the method's execution.
194
195You similarly can't use C<after> to affect the return value of a
196method.
197
198We limit C<before> and C<after> because this lets you write more
199concise code. You do not have to worry about passing C<@_> to the
6c17df8f 200original method, or forwarding its return value (being careful to
201preserve context).
e30e57c6 202
6c17df8f 203The C<around> method modifier has neither of these limitations, but
204is a little more verbose.
e67a0fca 205
206=head3 Can I use C<before> to stop execution of a method?
207
d03bd989 208Yes, but only if you throw an exception. If this is too drastic a
8b870d0e 209measure then we suggest using C<around> instead. The C<around> method
d03bd989 210modifier is the only modifier which can gracefully prevent execution
e67a0fca 211of the main method. Here is an example:
212
6c17df8f 213 around 'baz' => sub {
214 my $next = shift;
215 my ($self, %options) = @_;
216 unless ($options->{bar} eq 'foo') {
217 return 'bar';
218 }
3ae20eb6 219 $self->$next(%options);
6c17df8f 220 };
e67a0fca 221
d03bd989 222By choosing not to call the C<$next> method, you can stop the
e67a0fca 223execution of the main method.
224
225=head2 Type Constraints
226
6c17df8f 227=head3 How can I provide a custom error message for a type constraint?
e67a0fca 228
6c17df8f 229Use the C<message> option when building the subtype:
e67a0fca 230
d03bd989 231 subtype 'NaturalLessThanTen'
e67a0fca 232 => as 'Natural'
233 => where { $_ < 10 }
234 => message { "This number ($_) is not less than ten!" };
235
6c17df8f 236This C<message> block will be called when a value fails to pass the
237C<NaturalLessThanTen> constraint check.
e67a0fca 238
807f6b7c 239=head3 Can I turn off type constraint checking?
734d1752 240
6c17df8f 241Not yet. This option will likely come in a future release.
734d1752 242
b36c8076 243=head2 Roles
244
245=head3 How do I get Moose to call BUILD in all my composed roles?
246
6c17df8f 247See L<Moose::Cookbook::WTF> and specifically the
248B<Why is BUILD not called for my composed roles?> question in the
249B<Roles> section.
b36c8076 250
dab94063 251=head3 What are Traits, and how are they different from Roles?
a8de15f8 252
457ad5fc 253In Moose, a trait is almost exactly the same thing as a role, except
254that traits typically register themselves, which allows you to refer
255to them by a short name ("Big" vs "MyApp::Role::Big").
256
257In Moose-speak, a I<Role> is usually composed into a I<class> at
258compile time, whereas a I<Trait> is usually composed into an instance
6c17df8f 259of a class at runtime to add or modify the behavior of
260B<just that instance>.
a8de15f8 261
262Outside the context of Moose, traits and roles generally mean exactly the
263same thing. The original paper called them Traits, however Perl 6 will call
264them Roles.
265
e67a0fca 266=head1 AUTHOR
267
268Stevan Little E<lt>stevan@iinteractive.comE<gt>
269
270=head1 COPYRIGHT AND LICENSE
271
2840a3b2 272Copyright 2006-2009 by Infinity Interactive, Inc.
e67a0fca 273
274L<http://www.iinteractive.com>
275
276This library is free software; you can redistribute it and/or modify
277it under the same terms as Perl itself.
278
e760b278 279=cut