---
name: "Moose::Cookbook::FAQ"
section: "3pm"
platform: "linux"
package: "libmoose-perl"
version: "0.54-1"
release: "Debian 5.0 (Lenny)"
platforms: ["linux"]
url: "https://new.carta.tech/Moose::Cookbook::FAQ"
---

# Moose::Cookbook::FAQ(3pm)

Moose::Cookbook::FAQ - Frequently asked questions about Moose\
 **Module Stability** *Is Moose "production ready"?* Yes. I have several medium-to-large-ish web applications in  production using Moose, they have been running without  issue now for well over a year. At `$work` we are re-writing our core offering to use Moose,  so it's continued development is assured. Several other people on #moose either have apps in production  which use Moose, or are in the process of deploying sites  which use Moose. *Is Moose's API stable?* Yes and No. The external API, the one 90% of users will interact with, is **very stable** and any changes **will be 100% backwards**  **compatible**. The introspection API is *mostly* stable; I still  reserve the right to tweak that if needed, but I will do my  absolute best to maintain backwards compatibility here as well. *I heard Moose is slow, is this true?* Again, this one is tricky, so Yes *and* No. First let me say that *nothing* in life is free, and that some  Moose features do cost more than others. It is also the  policy of Moose to **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. 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. We are also discussing and experimenting with Module::Compile, and the idea of compiling highly optimized `".pmc"` files. In addition, we have mapped out some core methods as candidates for conversion to XS. *When will Moose 1.0 be ready?* It is right now, I declared 0.18 to be "ready to use".\
 **Constructors** *How do I write custom constructors with Moose?* Ideally, you should never write your own `"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 initialization code post instance construction,  then use the `"BUILD"` method. This feature is taken directly from  Perl 6. Every `"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 sub classing your class much easier. If you need to affect the constructor's parameters prior to the  instance actually being constructed, you have a number of options. To change the parameter processing as a whole, you can use the `"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 *coercions* (See the 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. *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 `"handles"` keyword, coercions, and `"lazy_build"`, so subclassing is often not the ideal route. That said, the default Moose constructors is inherited from Moose::Object. When inheriting from a non-Moose class, the inheritance chain to Moose::Object is broken. The simplest way to fix this is to simply explicitly inherit from Moose::Object yourself. However, this does not always fix the issue of actually calling the Moose constructor. Fortunately "new\_object" in Class::MOP::Class, the low level constructor, accepts the special `"__INSTANCE__"` parameter, allowing you to instantiate your Moose attributes:

```
  package My::HTML::Template;
  use Moose;

  # explicit inheritance
  extends 'HTML::Template', 'Moose::Object';

  # explicit constructor
  sub new {
      my $class = shift;
      # call HTML::Template's constructor
      my $obj = $class->SUPER::new(@_);
      return $class->meta->new_object(
          # pass in the constructed object
          # using the special key __INSTANCE__
          __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). Note that this doesn't call `"BUILDALL"` automatically, you must do that yourself. Other techniques can be used as well, such as creating the object  using `"Moose::Object::new"`, but calling the inherited non-Moose  class's initialization methods (if available). It is also entirely possible to just rely on HASH autovivification to create the slots needed for Moose based attributes, although this does restrict use of construction time attribute features somewhat. 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.\
 **Accessors** *How do I tell Moose to use get/set accessors?* The easiest way to accomplish this is to use the `"reader"` and  `"writer"` attribute options. Here is some example code:

```
  has 'bar' => (
      isa    => 'Baz',
      reader => 'get_bar',
      writer => 'set_bar',
  );
```

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 Moose::Policy, and more specifically Moose::Policy::FollowPBP. This will allow you to write:

```
  has 'bar' => (
      isa => 'Baz',
      is  => 'rw',
  );
```

And have Moose create seperate `"get_bar"` and `"set_bar"` methods instead of a single `"bar"` method. NOTE: This **cannot** be set globally in Moose, as that would break  other classes which are built with Moose. *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  and deflate. If you only need to inflate, then I suggest using coercions. Here is  some basic sample code for inflating a 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 DateTime objects, then attaches  a coercion to that subtype. The `"timestamp"` attribute is then told  to expect a `"DateTime"` type, and to try to coerce it. When a `"Str"` type is given to the `"timestamp"` accessor, it will attempt to  coerce the value into a `"DateTime"` object using the code in found  in the `"via"` block. For a more comprehensive example of using coercions, see the Moose::Cookbook::Recipe5. If you need to deflate your attribute, the current best practice is to  add an `"around"` modifier to your accessor. Here is some example code:

```
  # a timestamp which stores as
  # seconds from the epoch
  has 'timestamp' => (is => 'rw', isa => 'Int');

  around 'timestamp' => sub {
      my $next = shift;
      my ($self, $timestamp) = @_;
      # assume we get a DateTime object ...
      $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  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  explain it on #moose or the mailing list.\
 **Method Modifiers** *How can I affect the values in @\_ using "before"?* You can't, actually: `"before"` only runs before the main method,  and it cannot easily affect the method's execution. What you want is  an `"around"` method. *Can I use "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 `"around"` instead. The `"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) = @_;
      unless ($options->{bar} eq 'foo') {
        return 'bar';
      }
      $next->($self, %options);
  };
```

By choosing not to call the `$next` method, you can stop the  execution of the main method.\
 **Type Constraints** *How can I have a custom error message for a type constraint?* Use the `"message"` option when building the subtype, like so:

```
  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 `"NaturalLessThanTen"` constraint check. *Can I turn off type constraint checking?* Not yet, but soon. This option will likely be coming in the next  release.\
 **Roles** *How do I get Moose to call BUILD in all my composed roles?* See Moose::Cookbook::WTF and specifically the **How come BUILD**  **is not called for my composed roles?** question in the **Roles** section. Stevan Little \<stevan@iinteractive.com\> Copyright 2006-2008 by Infinity Interactive, Inc. \<http://www.iinteractive.com\> This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
