Update the "is Moose's API stable?" FAQ answer
[gitmo/Moose.git] / lib / Moose / Cookbook / FAQ.pod
index 6b2b1fd..1fff37c 100644 (file)
@@ -3,7 +3,7 @@
 
 =head1 NAME
 
-Moose::Cookbook::FAQ - Frequenty asked questions about Moose
+Moose::Cookbook::FAQ - Frequently asked questions about Moose
 
 =head1 FREQUENTLY ASKED QUESTIONS
 
@@ -11,75 +11,53 @@ Moose::Cookbook::FAQ - Frequenty asked questions about Moose
 
 =head3 Is Moose "production ready"?
 
-Yes and No. Currently I have one web application in production 
-using Moose, and at $work we are re-writing our core offering to 
-use Moose. Several other people on #moose either have sites in 
-production which use Moose, or are in the process of deploying 
-sites which use Moose. 
+Yes! Many sites with household names are using Moose to build
+high-traffic services. Countless others are using Moose in
+production.
 
-The biggest barrier to widespread use of Moose in production 
-right now is speed of development and speed of execution. 
-
-Since development is still happening, regular upgrades are a 
-fact of life. This can be hairy in production, so if this makes 
-you quake with fear, you might want to wait a few months.
-
-Then comes speed of execution. Moose is actually pretty fast, 
-and makes great effort to stay out of your way when you don't 
-want it there. However, certain parts of Moose are slow, such 
-as compile time setup, introspection and object construction 
-(only because it uses introspection). See L<Is Moose slow?> 
-below for a deeper discussion on the subject.
+As of this writing, Moose is a dependency of several hundred CPAN
+modules. L<http://cpants.perl.org/dist/used_by/Moose>
 
 =head3 Is Moose's API stable?
 
-Yes and No. The external API, the one 90% of users will interact
-with, is B<very stable> and any changes B<will be 100% backwards 
-compatible>. The introspection API is I<mostly> stable, I still 
-reserve the right to tweak that if needed, but I will do my 
-absolute best to maintain backwards comptability here as well.
+Yes. The sugary API, the one 95% of users will interact with, is
+B<very stable>. Any changes will be B<100% backwards compatible>.
 
-=head3 Is Moose slow?
-
-Again, this one is tricky, so Yes I<and> No.
+The meta API is less set in stone. We reserve the right to tweak
+parts of it to improve efficiency or consistency. This will not be
+done lightly. We do perform deprecation cycles. We I<really>
+do not like making ourselves look bad by breaking your code.
+Submitting test cases is the best way to ensure that your code is not
+inadvertantly broken by refactoring.
 
-First let me say that I<nothing> in life is free, and that some 
-Moose features do cost more than others. It is also the 
-policy of Moose to B<only charge you for the features you use>, 
-and to do our absolute best to not place any extra burdens on 
-the execution of your code for features you are not using. 
+=head3 I heard Moose is slow, is this true?
 
-Next, I will point out again that we are still in the "early 
-adopter" phase, so speed it not that important yet. We are 
-actually optimizing for "theoretical correctness" first, and 
-we will optimize for speed later. It has been our experience 
-that taking this approach allows for greater optimization 
-capacity. 
-
-And lastly, I want to reassure the speed junkies out there that 
-we B<are> working on it. 
+Again, this one is tricky, so Yes I<and> No.
 
-We have the immutable classes in Class::MOP, but which are not 
-yet integrated with Moose. These allow you to "close" a class 
-and then for many of it's more expensive methods to me memoized. 
-Our tests indicated a performance comparable (and in some 
-instances exceeding) that of hand-coded Perl.
+First let me say that I<nothing> in life is free, and that some
+Moose features do cost more than others. It is also the
+policy of Moose to B<only charge you for the features you use>,
+and to do our absolute best to not place any extra burdens on
+the execution of your code for features you are not using. Of
+course using Moose itself does involve some overhead, but it
+is mostly compile time. At this point we do have some options
+available for getting the speed you need.
 
-We are also discussing and experimenting with L<Module::Compile>, 
-and the idea of compiling highly optimized C<.pmc> files. And we 
-have also mapped out some core methods as canidates for conversion 
-to XS. 
+Currently we have the option of making your classes immutable
+as a means of boosting speed. This will mean a slightly larger compile
+time cost, but the runtime speed increase (especially in object
+construction) is pretty significant. This is not very well
+documented yet, so please ask on the list or on #moose for more
+information.
 
-=head3 When will Moose be 1.0 ready?
+We are also discussing and experimenting with L<Module::Compile>,
+and the idea of compiling highly optimized C<.pmc> files. In
+addition, we have mapped out some core methods as candidates for
+conversion to XS.
 
-I expect (barring unforseen circumstances) that Moose will be 
-at 1.0 by the end of this year (2006). Which means that it will be 
-completely stable and provide a number of optimization options to 
-suit the need for speed. 
+=head3 When will Moose 1.0 be ready?
 
-Will I have addressed all your concerns by then? Will all the 
-features you want be included? I don't know unless you tell me, 
-so come over to #moose and we can talk.
+It is right now, I declared 0.18 to be "ready to use".
 
 =head2 Constructors
 
@@ -89,54 +67,57 @@ Ideally, you should never write your own C<new> method, and should
 use Moose's other features to handle your specific object construction
 needs. Here are a few scenarios, and the Moose way to solve them;
 
-If you need to call initializtion code post instance construction, 
-then use the C<BUILD> method. This feature is taken directly from 
-Perl 6. Every C<BUILD> method in your inheritence chain is called 
-(in the correct order) immediately after the instance is constructed. 
-This allows you to ensure that all your superclasses are initialized 
+If you need to call initialization code post instance construction,
+then use the C<BUILD> method. This feature is taken directly from
+Perl 6. Every C<BUILD> method in your inheritance chain is called
+(in the correct order) immediately after the instance is constructed.
+This allows you to ensure that all your superclasses are initialized
 properly as well. This is the best approach to take (when possible)
 because it makes subclassing your class much easier.
 
-If you need to affect the constructor's parameters prior to the 
+If you need to affect the constructor's parameters prior to the
 instance actually being constructed, you have a number of options.
 
-First, there are I<coercions> (See the L<Moose::Cookbook::Recipe5> 
-for a complete example and explaination of coercions). With 
-coercions it is possible to morph argument values into the correct 
-expected types. This approach is the most flexible and robust, but 
-does have a slightly higher learning curve.
-
-Second, using an C<around> method modifier on C<new> can be an 
-effective way to affect the contents of C<@_> prior to letting 
-Moose deal with it. This carries with it the extra burden for 
-your subclasses, in that they have to be sure to explicitly 
-call your C<new> and/or work around your C<new> to get to the 
-version from L<Moose::Object>. 
-
-The last approach is to use the standard Perl technique of calling 
-the C<SUPER::new> within your own custom version of C<new>. This 
-of course brings with it all the issues of the C<around> solution 
-along with any issues C<SUPER::> might add as well.
-
-In short, try to use C<BUILD> and coercions, they are your best 
-bets.
-
-=head3 How do I make non-Moose constuctors work with Moose? 
-
-Moose provides it's own constructor, but it does it by making all 
-Moose-based classes inherit from L<Moose::Object>. When inheriting
-from a non-Moose class, the inheritence chain to L<Moose::Object> 
-is broken. The simplest way to fix this is to simply explicitly 
-inherit from L<Moose::Object> yourself. However, this does not 
-always fix the issue of a constructor. Here is a basic example of 
-how this can be worked around:
+To change the parameter processing as a whole, you can use
+the C<BUILDARGS> method. The default implementation accepts key/value
+pairs or a hash reference. You can override it to take positional args,
+or any other format
+
+To change the handling of individual parameters, there are I<coercions>
+(See the L<Moose::Cookbook::Basics::Recipe5> for a complete example and
+explanation of coercions). With coercions it is possible to morph
+argument values into the correct expected types. This approach is the
+most flexible and robust, but does have a slightly higher learning
+curve.
+
+=head3 How do I make non-Moose constructors work with Moose?
+
+Usually the correct approach to subclassing a non Moose class is
+delegation.  Moose makes this easy using the C<handles> keyword,
+coercions, and C<lazy_build>, so subclassing is often not the
+ideal route.
+
+That said, the default Moose constructor is inherited from
+L<Moose::Object>. When inheriting from a non-Moose class, the
+inheritance chain to L<Moose::Object> is broken. The simplest way
+to fix this is to simply explicitly inherit from L<Moose::Object>
+yourself.
+
+However, this does not always fix the issue of actually calling the Moose
+constructor. Fortunately, the modules L<MooseX::NonMoose> and
+L<MooseX::Alien> aim to make subclassing non-Moose classes easier.
+
+If neither extension fills your specific needs, you can use
+L<Class::MOP::Class/new_object>. This low-level constructor accepts the
+special C<__INSTANCE__> parameter, allowing you to instantiate your Moose
+attributes:
 
   package My::HTML::Template;
   use Moose;
-  
-  # explict inheritence 
+
+  # explicit inheritance
   extends 'HTML::Template', 'Moose::Object';
-  
+
   # explicit constructor
   sub new {
       my $class = shift;
@@ -145,94 +126,92 @@ how this can be worked around:
       return $class->meta->new_object(
           # pass in the constructed object
           # using the special key __INSTANCE__
-          __INSTANCE__ => $obj, @_
+          __INSTANCE__ => $obj,
+          @_, # pass in the normal args
       );
   }
 
-Of course this only works if both your Moose class, and the 
-inherited non-Moose class use the same instance type (typically 
-HASH refs). 
+Of course, this only works if both your Moose class and the
+inherited non-Moose class use the same instance type (typically
+HASH refs).
 
-Other techniques can be used as well, such as creating the object 
-using C<Moose::Object::new>, but calling the inherited non-Moose 
-class's initializtion methods (if available). 
+Note that this doesn't call C<BUILDALL> automatically, you must do that
+yourself.
 
-It is also entirely possible to just rely on HASH autovivification 
-to create the slot's needed for Moose based attributes. Although 
-this does somewhat restrict use of construction time attribute 
-features.
+Other techniques can be used as well, such as creating the object
+using C<Moose::Object::new>, but calling the inherited non-Moose
+class's initialization methods (if available).
 
-In short, there are several ways to go about this, it is best to 
-evaluate each case based on the class you wish to extend, and the 
-features you wish to employ. As always, both IRC and the mailing 
-list are great ways to get help finding the best approach.
+In short, there are several ways to extend non-Moose classes. It is
+best to evaluate each case based on the class you wish to extend,
+and the features you wish to employ. As always, both IRC and the
+mailing list are great ways to get help finding the best approach.
 
 =head2 Accessors
 
 =head3 How do I tell Moose to use get/set accessors?
 
-The easiest way to accomplish this is to use the C<reader> and 
+The easiest way to accomplish this is to use the C<reader> and
 C<writer> attribute options. Here is some example code:
 
   has 'bar' => (
       isa    => 'Baz',
-      reader => 'get_bar', 
+      reader => 'get_bar',
       writer => 'set_bar',
   );
 
-Moose will still take advantage of type constraints, triggers, etc. 
-when creating these methods. 
+Moose will still take advantage of type constraints, triggers, etc.
+when creating these methods.
 
-If you do not like this much typing, and wish it to be a default for 
-your class. Please see L<Moose::Policy>, and more specifically the 
-L<Moose::Policy::FollowPBP>. This will allow you to write this:
+If you do not like this much typing, and wish it to be a default for your
+class, please see L<MooseX::FollowPBP>. This will allow you to write:
 
   has 'bar' => (
       isa => 'Baz',
       is  => 'rw',
   );
 
-And have Moose create C<get_bar> and C<set_bar> instead of the usual 
-C<bar>.
+And have Moose create separate C<get_bar> and C<set_bar> methods
+instead of a single C<bar> method.
 
-NOTE: This B<cannot> be set globally in Moose, as this would break 
+NOTE: This B<cannot> be set globally in Moose, as that would break
 other classes which are built with Moose.
 
 =head3 How can I get Moose to inflate/deflate values in the accessor?
 
-Well, the first question to ask is if you actually need both inflate 
+Well, the first question to ask is if you actually need both inflate
 and deflate.
 
-If you only need to inflate, then I suggest using coercions. Here is 
-some basic sample code for inflating a L<DateTime> object. 
+If you only need to inflate, then I suggest using coercions. Here is
+some basic sample code for inflating a L<DateTime> object:
 
   subtype 'DateTime'
       => as 'Object'
       => where { $_->isa('DateTime') };
-      
+
   coerce 'DateTime'
       => from 'Str'
         => via { DateTime::Format::MySQL->parse_datetime($_) };
-        
+
   has 'timestamp' => (is => 'rw', isa => 'DateTime', coerce => 1);
 
-This creates a custom subtype for L<DateTime> objects, then attaches 
-a coercion to that subtype. The C<timestamp> attribute is then told 
-to expect a C<DateTime> type, and to try and coerce it. When a C<Str>
-type is given to the C<timestamp> accessor, it will attempt to 
-coerce the value into a C<DateTime> object using the code in found 
-in the C<via> block. 
+This creates a custom subtype for L<DateTime> objects, then attaches
+a coercion to that subtype. The C<timestamp> attribute is then told
+to expect a C<DateTime> type, and to try to coerce it. When a C<Str>
+type is given to the C<timestamp> accessor, it will attempt to
+coerce the value into a C<DateTime> object using the code in found
+in the C<via> block.
 
-For a more detailed and complete example of coercions, see the 
-L<Moose::Cookbook::Recipe5>.
+For a more comprehensive example of using coercions, see the
+L<Moose::Cookbook::Basics::Recipe5>.
 
-If you need to deflate your attribute, the current best practice is to 
+If you need to deflate your attribute, the current best practice is to
 add an C<around> modifier to your accessor. Here is some example code:
 
-  # a timestamp which stores as 
+  # a timestamp which stores as
   # seconds from the epoch
   has 'timestamp' => (is => 'rw', isa => 'Int');
-  
+
   around 'timestamp' => sub {
       my $next = shift;
       my ($self, $timestamp) = @_;
@@ -240,57 +219,82 @@ add an C<around> modifier to your accessor. Here is some example code:
       $next->($self, $timestamp->epoch);
   };
 
-It is also possible to do deflation using coercion, but this tends 
-to get quite complex and require many subtypes. An example of this 
-is outside the scope of this document, ask on #moose or send a mail 
+It is also possible to do deflation using coercion, but this tends
+to get quite complex and require many subtypes. An example of this
+is outside the scope of this document, ask on #moose or send a mail
 to the list.
 
-Still another option is to write a custom attribute metaclass, which 
-is also outside the scope of this document, but I would be happy to 
+Still another option is to write a custom attribute metaclass, which
+is also outside the scope of this document, but I would be happy to
 explain it on #moose or the mailing list.
 
-=head2 Method Modfiers
+=head2 Method Modifiers
 
 =head3 How can I affect the values in C<@_> using C<before>?
 
-You can't actually, C<before> only runs before the main method, 
-and it cannot easily affect the execution of it. What you want is 
-an C<around> method. 
+You can't, actually: C<before> only runs before the main method,
+and it cannot easily affect the method's execution. What you want is
+an C<around> method.
 
 =head3 Can I use C<before> to stop execution of a method?
 
-Yes, but only if you throw an exception. If this is too drastic a 
-measure then I suggest using C<around> instead. The C<around> method 
-modifier is the only modifier which can actually stop the execution 
+Yes, but only if you throw an exception. If this is too drastic a
+measure then I suggest using C<around> instead. The C<around> method
+modifier is the only modifier which can gracefully prevent execution
 of the main method. Here is an example:
 
   around 'baz' => sub {
       my $next = shift;
       my ($self, %options) = @_;
-      if ($options{bar} eq 'foo') {
-          $next->($self, %options);
-      }
-      else {
-          return 'bar';
+      unless ($options->{bar} eq 'foo') {
+       return 'bar';
       }
+      $next->($self, %options);
   };
 
-By choosing not to call the C<$next> method, you can stop the 
+By choosing not to call the C<$next> method, you can stop the
 execution of the main method.
 
 =head2 Type Constraints
 
 =head3 How can I have a custom error message for a type constraint?
 
-Use the C<message> option when building the subtype. Like so:
+Use the C<message> option when building the subtype, like so:
 
-  subtype 'NaturalLessThanTen' 
+  subtype 'NaturalLessThanTen'
       => as 'Natural'
       => where { $_ < 10 }
       => message { "This number ($_) is not less than ten!" };
 
 This will be called when a value fails to pass the C<NaturalLessThanTen>
-constraint check. 
+constraint check.
+
+=head3 Can I turn off type constraint checking?
+
+Not yet, but soon. This option will likely be coming in the next
+release.
+
+=head2 Roles
+
+=head3 How do I get Moose to call BUILD in all my composed roles?
+
+See L<Moose::Cookbook::WTF> and specifically the B<Why is BUILD
+not called for my composed roles?> question in the B<Roles> section.
+
+=head3 What are Traits, and how are they different from Roles?
+
+In Moose, a trait is almost exactly the same thing as a role, except
+that traits typically register themselves, which allows you to refer
+to them by a short name ("Big" vs "MyApp::Role::Big").
+
+In Moose-speak, a I<Role> is usually composed into a I<class> at
+compile time, whereas a I<Trait> is usually composed into an instance
+of a class at runtime to add or modify the behavior of B<just that
+instance>.
+
+Outside the context of Moose, traits and roles generally mean exactly the
+same thing. The original paper called them Traits, however Perl 6 will call
+them Roles.
 
 =head1 AUTHOR
 
@@ -298,11 +302,11 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006 by Infinity Interactive, Inc.
+Copyright 2006-2009 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
-=cut
\ No newline at end of file
+=cut