Moose FAQ: Expand "Can I turn off type constraint checking?"
[gitmo/Moose.git] / lib / Moose / Manual / FAQ.pod
index 3488617..5a8cda0 100644 (file)
@@ -15,11 +15,11 @@ __END__
 
 Yes! Many sites with household names are using Moose to build
 high-traffic services. Countless others are using Moose in production.
-See L<http://www.iinteractive.com/moose/about.html#organizations> for
+See L<http://moose.iinteractive.com/about.html#organizations> for
 a partial list.
 
 As of this writing, Moose is a dependency of several hundred CPAN
-modules. L<http://cpants.perl.org/dist/used_by/Moose>
+modules. L<https://metacpan.org/requires/module/Moose>
 
 =head3 Is Moose's API stable?
 
@@ -77,12 +77,11 @@ 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.
+To change the handling of individual parameters, there are I<coercions> (See
+the L<Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion> 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?
 
@@ -92,7 +91,7 @@ coercions, and C<lazy_build>, so subclassing is often not the ideal
 route.
 
 That said, if you really need to inherit from a non-Moose class, see
-L<Moose::Cookbook::Basics::Recipe11> for an example of how to do it,
+L<Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent> for an example of how to do it,
 or take a look at L<Moose::Manual::MooseX/"MooseX::NonMoose">.
 
 =head2 Accessors
@@ -128,9 +127,9 @@ L<MooseX::SemiAffordanceAccessor>.
 
 NOTE: This B<cannot> be set globally in Moose, as that would break
 other classes which are built with Moose. You can still save on typing
-by defining a new L<MyApp::Moose> that exports Moose's sugar and then
+by defining a new C<MyApp::Moose> that exports Moose's sugar and then
 turns on L<MooseX::FollowPBP>. See
-L<Moose::Cookbook::Extending::Recipe4>.
+L<Moose::Cookbook::Extending::Mooseish_MooseSugar>.
 
 =head3 How can I inflate/deflate values in accessors?
 
@@ -156,7 +155,7 @@ coerce the value into a C<DateTime> object using the code in found
 in the C<via> block.
 
 For a more comprehensive example of using coercions, see the
-L<Moose::Cookbook::Basics::Recipe5>.
+L<Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion>.
 
 If you need to deflate your attribute's value, the current best
 practice is to add an C<around> modifier to your accessor:
@@ -267,7 +266,13 @@ C<NaturalLessThanTen> constraint check.
 
 =head3 Can I turn off type constraint checking?
 
-Not yet. This option may come in a future release.
+There's no support for it in the core of Moose yet. This option may
+come in a future release.
+
+Meanwhile there's a L<MooseX
+extension|MooseX::Attribute::TypeConstraint::CustomizeFatal> that
+allows you to do this on a per-attribute basis, and if it doesn't do
+what you it's easy to write one that fits your use case.
 
 =head3 My coercions stopped working with recent Moose, why did you break it?
 
@@ -308,8 +313,9 @@ As for alternate solutions, there are a couple.
 =item *
 
 Using a combination of lazy and default in your attributes to defer
-initialization (see the Binary Tree example in the cookbook for a good
-example of lazy/default usage L<Moose::Cookbook::Basics::Recipe3>)
+initialization (see the Binary Tree example in the cookbook for a good example
+of lazy/default usage
+L<Moose::Cookbook::Basics::BinaryTree_AttributeFeatures>)
 
 =item *
 
@@ -348,7 +354,7 @@ not the best tool for the job, and you really should be using
 classes. Or, at the very least, you should reduce the amount of
 functionality in your role so that it does not require initialization.
 
-=head3 What are Traits, and how are they different from Roles?
+=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
@@ -360,17 +366,37 @@ 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.
+the same thing. The original paper called them traits, but Perl 6
+will call them roles.
+
+=head3 Can an attribute-generated method (e.g. an accessor) satisfy requires?
+
+Yes, just be sure to consume the role I<after> declaring your
+attribute.  L<Moose::Manual::Roles/Required Attributes> provides
+an example:
+
+  package Breakable;
+  use Moose::Role;
+  requires 'stress';
+
+  package Car;
+  use Moose;
+  has 'stress' => ( is  => 'rw', isa => 'Int' );
+  with 'Breakable';
+
+If you mistakenly consume the C<Breakable> role before declaring your
+C<stress> attribute, you would see an error like this:
+
+  'Breakable' requires the method 'stress' to be implemented by 'Car' at...
 
 =head2 Moose and Subroutine Attributes
 
 =head3 Why don't subroutine attributes I inherited from a superclass work?
 
-Currently when you subclass a module, this is done at runtime with the
-C<extends> keyword but attributes are checked at compile time by
+Currently when subclassing a module is done at runtime with the
+C<extends> keyword, but attributes are checked at compile time by
 Perl. To make attributes work, you must place C<extends> in a C<BEGIN>
-block so that the attribute handlers will be available at compile time
+block so that the attribute handlers will be available at compile time,
 like this:
 
   BEGIN { extends qw/Foo/ }