nobody is really working on xs accessors anymore
[gitmo/Moose.git] / lib / Moose / Manual / FAQ.pod
CommitLineData
daa0fd7d 1package Moose::Manual::FAQ;
e67a0fca 2
daa0fd7d 3# ABSTRACT: Frequently asked questions about Moose
4
5__END__
e67a0fca 6
e67a0fca 7
daa0fd7d 8=pod
e67a0fca 9
10=head1 FREQUENTLY ASKED QUESTIONS
11
2a0f3bd3 12=head2 Module Stability
13
14=head3 Is Moose "production ready"?
15
2222bdc4 16Yes! Many sites with household names are using Moose to build
19440c7c 17high-traffic services. Countless others are using Moose in production.
dff1b5f2 18See L<http://www.iinteractive.com/moose/about.html#organizations> for
19a partial list.
734d1752 20
2222bdc4 21As of this writing, Moose is a dependency of several hundred CPAN
22modules. L<http://cpants.perl.org/dist/used_by/Moose>
2a0f3bd3 23
24=head3 Is Moose's API stable?
25
c698114d 26Yes. The sugary API, the one 95% of users will interact with, is
27B<very stable>. Any changes will be B<100% backwards compatible>.
28
29The meta API is less set in stone. We reserve the right to tweak
30parts of it to improve efficiency or consistency. This will not be
31done lightly. We do perform deprecation cycles. We I<really>
32do not like making ourselves look bad by breaking your code.
33Submitting test cases is the best way to ensure that your code is not
7fe3cafa 34inadvertently broken by refactoring.
2a0f3bd3 35
734d1752 36=head3 I heard Moose is slow, is this true?
2a0f3bd3 37
38Again, this one is tricky, so Yes I<and> No.
39
19440c7c 40Firstly, I<nothing> in life is free, and some Moose features do cost
41more than others. It is also the policy of Moose to B<only charge you
42for the features you use>, and to do our absolute best to not place
43any extra burdens on the execution of your code for features you are
44not using. Of course using Moose itself does involve some overhead,
45but it is mostly compile time. At this point we do have some options
46available for getting the speed you need.
c32ff715 47
19440c7c 48Currently we provide the option of making your classes immutable as a
49means of boosting speed. This will mean a slightly larger compile time
50cost, but the runtime speed increase (especially in object
51construction) is pretty significant. This can be done with the
52following code:
53
54 MyClass->meta->make_immutable();
c32ff715 55
807f6b7c 56=head3 When will Moose 1.0 be ready?
2a0f3bd3 57
19440c7c 58Moose is ready now! Stevan Little declared 0.18, released in March
592007, to be "ready to use".
2a0f3bd3 60
e67a0fca 61=head2 Constructors
62
63=head3 How do I write custom constructors with Moose?
64
19440c7c 65Ideally, you should never write your own C<new> method, and should use
66Moose's other features to handle your specific object construction
e67a0fca 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,
19440c7c 70then use the C<BUILD> method. This feature is taken directly from Perl
716. Every C<BUILD> method in your inheritance chain is called (in the
72correct order) immediately after the instance is constructed. This
73allows 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
19440c7c 80To change the parameter processing as a whole, you can use the
81C<BUILDARGS> method. The default implementation accepts key/value
82pairs or a hash reference. You can override it to take positional
83args, or any other format
ce21ecc5 84
19440c7c 85To change the handling of individual parameters, there are
86I<coercions> (See the L<Moose::Cookbook::Basics::Recipe5> for a
87complete example and explanation of coercions). With coercions it is
88possible to morph argument values into the correct expected
89types. This approach is the most flexible and robust, but does have a
90slightly higher learning curve.
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,
19440c7c 96coercions, and C<lazy_build>, so subclassing is often not the ideal
97route.
e760b278 98
fe4975b3 99That said, if you really need to inherit from a non-Moose class, see
cc7dafef 100L<Moose::Cookbook::Basics::Recipe11> for an example of how to do it,
101or take a look at L<Moose::Manual::MooseX/"MooseX::NonMoose">.
e67a0fca 102
103=head2 Accessors
104
105=head3 How do I tell Moose to use get/set accessors?
106
d03bd989 107The easiest way to accomplish this is to use the C<reader> and
6c17df8f 108C<writer> attribute options:
e67a0fca 109
110 has 'bar' => (
111 isa => 'Baz',
d03bd989 112 reader => 'get_bar',
e67a0fca 113 writer => 'set_bar',
114 );
115
d03bd989 116Moose will still take advantage of type constraints, triggers, etc.
117when creating these methods.
e67a0fca 118
19440c7c 119If you do not like this much typing, and wish it to be a default for
120your classes, please see L<MooseX::FollowPBP>. This extension will
121allow you to write:
e67a0fca 122
123 has 'bar' => (
124 isa => 'Baz',
125 is => 'rw',
126 );
127
19440c7c 128Moose will create separate C<get_bar> and C<set_bar> methods instead
129of a single C<bar> method.
130
131If you like C<bar> and C<set_bar>, see
132L<MooseX::SemiAffordanceAccessor>.
e67a0fca 133
d03bd989 134NOTE: This B<cannot> be set globally in Moose, as that would break
6c17df8f 135other classes which are built with Moose. You can still save on typing
136by defining a new L<MyApp::Moose> that exports Moose's sugar and then
19440c7c 137turns on L<MooseX::FollowPBP>. See
138L<Moose::Cookbook::Extending::Recipe4>.
e67a0fca 139
6c17df8f 140=head3 How can I inflate/deflate values in accessors?
e67a0fca 141
d03bd989 142Well, the first question to ask is if you actually need both inflate
e67a0fca 143and deflate.
144
8b870d0e 145If you only need to inflate, then we suggest using coercions. Here is
807f6b7c 146some basic sample code for inflating a L<DateTime> object:
e67a0fca 147
6c17df8f 148 class_type 'DateTime';
d03bd989 149
e67a0fca 150 coerce 'DateTime'
151 => from 'Str'
d8e332d5 152 => via { DateTime::Format::MySQL->parse_datetime($_) };
d03bd989 153
e67a0fca 154 has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
155
6c17df8f 156This creates a custom type for L<DateTime> objects, then attaches
157a coercion to that type. The C<timestamp> attribute is then told
807f6b7c 158to expect a C<DateTime> type, and to try to coerce it. When a C<Str>
d03bd989 159type is given to the C<timestamp> accessor, it will attempt to
160coerce the value into a C<DateTime> object using the code in found
161in the C<via> block.
e67a0fca 162
807f6b7c 163For a more comprehensive example of using coercions, see the
5cfe3805 164L<Moose::Cookbook::Basics::Recipe5>.
e67a0fca 165
19440c7c 166If you need to deflate your attribute's value, the current best
167practice is to add an C<around> modifier to your accessor:
e67a0fca 168
d03bd989 169 # a timestamp which stores as
e67a0fca 170 # seconds from the epoch
171 has 'timestamp' => (is => 'rw', isa => 'Int');
d03bd989 172
e67a0fca 173 around 'timestamp' => sub {
174 my $next = shift;
24d8fc0d 175 my $self = shift;
176
177 return $self->$next unless @_;
178
e67a0fca 179 # assume we get a DateTime object ...
24d8fc0d 180 my $timestamp = shift;
181 return $self->$next( $timestamp->epoch );
e67a0fca 182 };
183
19440c7c 184It is also possible to do deflation using coercion, but this tends to
185get quite complex and require many subtypes. An example of this is
186outside the scope of this document, ask on #moose or send a mail to
187the list.
e67a0fca 188
d03bd989 189Still another option is to write a custom attribute metaclass, which
8b870d0e 190is also outside the scope of this document, but we would be happy to
e67a0fca 191explain it on #moose or the mailing list.
192
19440c7c 193=head3 I created an attribute, where are my accessors?
194
195Accessors are B<not> created implicitly, you B<must> ask Moose to
196create them for you. My guess is that you have this:
197
198 has 'foo' => (isa => 'Bar');
199
200when what you really want to say is:
201
202 has 'foo' => (isa => 'Bar', is => 'rw');
203
204The reason this is so is because it is a perfectly valid use case to
205I<not> have an accessor. The simplest one is that you want to write
206your own. If Moose created one automatically, then because of the
207order in which classes are constructed, Moose would overwrite your
208custom accessor. You wouldn't want that would you?
209
4711f5f7 210=head2 Method Modifiers
e67a0fca 211
212=head3 How can I affect the values in C<@_> using C<before>?
213
19440c7c 214You can't, actually: C<before> only runs before the main method, and
215it cannot easily affect the method's execution.
e30e57c6 216
217You similarly can't use C<after> to affect the return value of a
218method.
219
220We limit C<before> and C<after> because this lets you write more
221concise code. You do not have to worry about passing C<@_> to the
6c17df8f 222original method, or forwarding its return value (being careful to
223preserve context).
e30e57c6 224
19440c7c 225The C<around> method modifier has neither of these limitations, but is
226a little more verbose.
e67a0fca 227
228=head3 Can I use C<before> to stop execution of a method?
229
d03bd989 230Yes, but only if you throw an exception. If this is too drastic a
8b870d0e 231measure then we suggest using C<around> instead. The C<around> method
d03bd989 232modifier is the only modifier which can gracefully prevent execution
e67a0fca 233of the main method. Here is an example:
234
6c17df8f 235 around 'baz' => sub {
236 my $next = shift;
237 my ($self, %options) = @_;
238 unless ($options->{bar} eq 'foo') {
239 return 'bar';
240 }
3ae20eb6 241 $self->$next(%options);
6c17df8f 242 };
e67a0fca 243
d03bd989 244By choosing not to call the C<$next> method, you can stop the
e67a0fca 245execution of the main method.
246
19440c7c 247=head3 Why can't I see return values in an C<after> modifier?
248
249As with the C<before> modifier, the C<after> modifier is simply called
250I<after> the main method. It is passed the original contents of C<@_>
251and B<not> the return values of the main method.
252
253Again, the arguments are too lengthy as to why this has to be. And as
254with C<before> I recommend using an C<around> modifier instead. Here
255is some sample code:
256
257 around 'foo' => sub {
258 my $next = shift;
259 my ($self, @args) = @_;
260 my @rv = $next->($self, @args);
261 # do something silly with the return values
262 return reverse @rv;
263 };
264
e67a0fca 265=head2 Type Constraints
266
6c17df8f 267=head3 How can I provide a custom error message for a type constraint?
e67a0fca 268
6c17df8f 269Use the C<message> option when building the subtype:
e67a0fca 270
d03bd989 271 subtype 'NaturalLessThanTen'
e67a0fca 272 => as 'Natural'
273 => where { $_ < 10 }
274 => message { "This number ($_) is not less than ten!" };
275
6c17df8f 276This C<message> block will be called when a value fails to pass the
277C<NaturalLessThanTen> constraint check.
e67a0fca 278
807f6b7c 279=head3 Can I turn off type constraint checking?
734d1752 280
19440c7c 281Not yet. This option may come in a future release.
734d1752 282
6b5a29f4 283=head3 My coercions stopped working with recent Moose, why did you break it?
284
285Moose 0.76 fixed a case where Coercions were being applied even if the original constraint passed. This has caused some edge cases to fail where people were doing something like
286
287 subtype Address => as 'Str';
288 coerce Address => from Str => via { get_address($_) };
cc7dafef 289
6b5a29f4 290Which is not what they intended. The Type Constraint C<Address> is too loose in this case, it is saying that all Strings are Addresses, which is obviously not the case. The solution is to provide a where clause that properly restricts the Type Constraint.
291
292 subtype Address => as Str => where { looks_like_address($_) };
293
294This will allow the coercion to apply only to strings that fail to look like an Address.
295
b36c8076 296=head2 Roles
297
19440c7c 298=head3 Why is BUILD not called for my composed roles?
299
beb804d9 300C<BUILD> is never called in composed roles. The primary reason is that
19440c7c 301roles are B<not> order sensitive. Roles are composed in such a way
302that the order of composition does not matter (for information on the
303deeper theory of this read the original traits papers here
304L<http://www.iam.unibe.ch/~scg/Research/Traits/>).
305
306Because roles are essentially unordered, it would be impossible to
beb804d9 307determine the order in which to execute the C<BUILD> methods.
19440c7c 308
309As for alternate solutions, there are a couple.
310
311=over 4
b36c8076 312
19440c7c 313=item *
314
315Using a combination of lazy and default in your attributes to defer
316initialization (see the Binary Tree example in the cookbook for a good
317example of lazy/default usage L<Moose::Cookbook::Basics::Recipe3>)
318
319=item *
320
321Use attribute triggers, which fire after an attribute is set, to
322facilitate initialization. These are described in the L<Moose> docs,
323and examples can be found in the test suite.
324
325=back
326
327In general, roles should not I<require> initialization; they should
328either provide sane defaults or should be documented as needing
329specific initialization. One such way to "document" this is to have a
330separate attribute initializer which is required for the role. Here is
331an example of how to do this:
332
333 package My::Role;
334 use Moose::Role;
335
336 has 'height' => (
337 is => 'rw',
338 isa => 'Int',
339 lazy => 1,
340 default => sub {
341 my $self = shift;
342 $self->init_height;
343 }
344 );
345
346 requires 'init_height';
347
348In this example, the role will not compose successfully unless the
349class provides a C<init_height> method.
350
351If none of those solutions work, then it is possible that a role is
352not the best tool for the job, and you really should be using
353classes. Or, at the very least, you should reduce the amount of
354functionality in your role so that it does not require initialization.
b36c8076 355
dab94063 356=head3 What are Traits, and how are they different from Roles?
a8de15f8 357
457ad5fc 358In Moose, a trait is almost exactly the same thing as a role, except
359that traits typically register themselves, which allows you to refer
360to them by a short name ("Big" vs "MyApp::Role::Big").
361
362In Moose-speak, a I<Role> is usually composed into a I<class> at
363compile time, whereas a I<Trait> is usually composed into an instance
19440c7c 364of a class at runtime to add or modify the behavior of B<just that
365instance>.
366
367Outside the context of Moose, traits and roles generally mean exactly
368the same thing. The original paper called them Traits, however Perl 6
369will call them Roles.
370
371=head2 Moose and Subroutine Attributes
372
373=head3 Why don't subroutine attributes I inherited from a superclass work?
374
375Currently when you subclass a module, this is done at runtime with the
376C<extends> keyword but attributes are checked at compile time by
377Perl. To make attributes work, you must place C<extends> in a C<BEGIN>
378block so that the attribute handlers will be available at compile time
379like this:
380
381 BEGIN { extends qw/Foo/ }
382
383Note that we're talking about Perl's subroutine attributes here, not
384Moose attributes:
a8de15f8 385
19440c7c 386 sub foo : Bar(27) { ... }
a8de15f8 387
e760b278 388=cut