1 package Moose::Cookbook::Basics::Recipe8;
3 # ABSTRACT: Builder methods and lazy_build
15 has 'node' => (is => 'rw', isa => 'Any');
20 predicate => 'has_parent',
27 predicate => 'has_left',
29 builder => '_build_child_tree',
35 predicate => 'has_right',
37 builder => '_build_child_tree',
40 before 'right', 'left' => sub {
41 my ($self, $tree) = @_;
42 $tree->parent($self) if defined $tree;
45 sub _build_child_tree {
48 return BinaryTree->new( parent => $self );
53 If you've already read L<Moose::Cookbook::Basics::Recipe3>, then this
54 example should look very familiar. In fact, all we've done here is
55 replace the attribute's C<default> parameter with a C<builder>.
57 In this particular case, the C<default> and C<builder> options act in
58 exactly the same way. When the C<left> or C<right> attribute is read,
59 Moose calls the builder method to initialize the attribute.
61 Note that Moose calls the builder method I<on the object which has the
62 attribute>. Here's an example:
64 my $tree = BinaryTree->new();
66 my $left = $tree->left();
68 When C<< $tree->left() >> is called, Moose calls C<<
69 $tree->_build_child_tree() >> in order to populate the C<left>
70 attribute. If we had passed C<left> to the original constructor, the
71 builder would not be called.
73 There are some differences between C<default> and C<builder>. Notably,
74 a builder is subclassable, and can be composed from a role. See
75 L<Moose::Manual::Attributes> for more details.
77 =head2 The lazy_build shortcut
79 The C<lazy_build> attribute option can be used as sugar to specify
80 a whole set of attribute options at once:
88 This is a shorthand for:
95 builder => '_build_animal',
96 predicate => 'has_animal',
97 clearer => 'clear_animal',
100 If your attribute starts with an underscore, Moose is smart and will
101 do the right thing with the C<predicate> and C<clearer>, making them
102 both start with an underscore. The C<builder> method I<always> starts
105 You can read more about C<lazy_build> in L<Moose::Meta::Attribute>
109 The C<builder> option is a more OO-friendly version of the C<default>
110 functionality. It also separates the default-generating code into a
111 well-defined method. Sprinkling your attribute definitions with
112 anonymous subroutines can be quite ugly and hard to follow.