Tests and implementation for builder with lazy and clearer
[gitmo/Mouse.git] / t / 023-builder.t
CommitLineData
b6e1128f 1#!/usr/bin/env perl
2use strict;
3use warnings;
9367e029 4use Test::More tests => 20;
b6e1128f 5
6my $builder_called = 0;
9367e029 7my $lazy_builder_called = 0;
b6e1128f 8
9do {
10 package Class;
11 use Mouse;
12
13 has name => (
14 is => 'rw',
15 isa => 'Str',
16 builder => '_build_name',
17 );
18
b6e1128f 19 sub _build_name {
20 my $self = shift;
21 ++$builder_called;
9367e029 22 return "FRANK";
b6e1128f 23 };
9367e029 24
25 has age => (
26 is => 'ro',
27 isa => 'Int',
28 builder => '_build_age',
29 lazy => 1,
30 clearer => 'clear_age',
31 );
32
33 sub default_age { 20 }
34 sub _build_age {
35 my $self = shift;
36 ++$lazy_builder_called;
37 return $self->default_age;
38 };
39
b6e1128f 40};
41
9367e029 42# eager builder
b6e1128f 43my $object = Class->new(name => "Bob");
44is($builder_called, 0, "builder not called in the constructor when we pass a value");
45is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor");
46$object->name("Bill");
47is($object->name, "Bill", "builder doesn't matter when we just set the value in writer");
48is($builder_called, 0, "builder not called in the setter");
49$builder_called = 0;
50
51my $object2 = Class->new;
52is($object2->name, "FRANK", "builder called to provide the default value");
53is($builder_called, 1, "builder called ONCE to provide the default value");
54
9367e029 55# lazy builder
56my $object3 = Class->new;
57is($lazy_builder_called, 0, "lazy builder not called yet");
58is($object3->age, 20, "lazy builder value");
59is($lazy_builder_called, 1, "lazy builder called on get");
60is($object3->age, 20, "lazy builder value");
61is($lazy_builder_called, 1, "lazy builder not called on subsequent gets");
62
63$object3->clear_age;
64is($lazy_builder_called, 1, "lazy builder not called on clear");
65is($object3->age, 20, "lazy builder value");
66is($lazy_builder_called, 2, "lazy builder called on get after clear");
67
68$lazy_builder_called = 0 ;
69my $object4 = Class->new(age => 50);
70is($lazy_builder_called, 0, "lazy builder not called yet");
71is($object4->age, 50, "value from constructor");
72is($lazy_builder_called, 0, "lazy builder not called if value is from constructor");
73
74$object4->clear_age;
75is($lazy_builder_called, 0, "lazy builder not called on clear");
76is($object4->age, 20, "lazy builder value");
77is($lazy_builder_called, 1, "lazy builder called on get after clear");