Commit | Line | Data |
b6e1128f |
1 | #!/usr/bin/env perl |
2 | use strict; |
3 | use warnings; |
010a2b16 |
4 | use Test::More tests => 34; |
b6e1128f |
5 | |
6 | my $builder_called = 0; |
9367e029 |
7 | my $lazy_builder_called = 0; |
b6e1128f |
8 | |
9 | do { |
10 | package Class; |
11 | use Mouse; |
12 | |
13 | has name => ( |
5d5a3b5d |
14 | is => 'rw', |
15 | isa => 'Str', |
16 | builder => '_build_name', |
17 | predicate => 'has_name', |
010a2b16 |
18 | clearer => 'clear_name', |
b6e1128f |
19 | ); |
20 | |
b6e1128f |
21 | sub _build_name { |
22 | my $self = shift; |
23 | ++$builder_called; |
9367e029 |
24 | return "FRANK"; |
b6e1128f |
25 | }; |
9367e029 |
26 | |
27 | has age => ( |
45959ffa |
28 | is => 'ro', |
29 | isa => 'Int', |
30 | lazy_build => 1, |
31 | clearer => 'clear_age', |
32 | predicate => 'has_age', |
9367e029 |
33 | ); |
34 | |
35 | sub default_age { 20 } |
36 | sub _build_age { |
37 | my $self = shift; |
38 | ++$lazy_builder_called; |
39 | return $self->default_age; |
40 | }; |
41 | |
b6e1128f |
42 | }; |
43 | |
9367e029 |
44 | # eager builder |
b6e1128f |
45 | my $object = Class->new(name => "Bob"); |
5d5a3b5d |
46 | ok($object->has_name, "predicate: value from constructor"); |
b6e1128f |
47 | is($builder_called, 0, "builder not called in the constructor when we pass a value"); |
48 | is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor"); |
49 | $object->name("Bill"); |
50 | is($object->name, "Bill", "builder doesn't matter when we just set the value in writer"); |
51 | is($builder_called, 0, "builder not called in the setter"); |
52 | $builder_called = 0; |
53 | |
010a2b16 |
54 | $object->clear_name; |
55 | ok(!$object->has_name, "predicate: no value after clear"); |
56 | is($object->name, undef, "eager builder does NOT swoop in after clear"); |
57 | ok(!$object->has_name, "predicate: no value after clear and get"); |
58 | is($builder_called, 0, "builder not called in the getter, even after clear"); |
59 | $builder_called = 0; |
60 | |
b6e1128f |
61 | my $object2 = Class->new; |
5d5a3b5d |
62 | ok($object2->has_name, "predicate: value from eager builder"); |
b6e1128f |
63 | is($object2->name, "FRANK", "builder called to provide the default value"); |
64 | is($builder_called, 1, "builder called ONCE to provide the default value"); |
65 | |
9367e029 |
66 | # lazy builder |
67 | my $object3 = Class->new; |
68 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
5d5a3b5d |
69 | ok(!$object3->has_age, "predicate: no age yet"); |
9367e029 |
70 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
71 | ok($object3->has_age, "predicate: have value after get"); |
9367e029 |
72 | is($lazy_builder_called, 1, "lazy builder called on get"); |
73 | is($object3->age, 20, "lazy builder value"); |
74 | is($lazy_builder_called, 1, "lazy builder not called on subsequent gets"); |
5d5a3b5d |
75 | ok($object3->has_age, "predicate: have value after subsequent gets"); |
9367e029 |
76 | |
5d5a3b5d |
77 | $lazy_builder_called = 0; |
9367e029 |
78 | $object3->clear_age; |
5d5a3b5d |
79 | ok(!$object3->has_age, "predicate: no value after clear"); |
80 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
9367e029 |
81 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
82 | ok($object3->has_age, "predicate: have value after clear and get"); |
83 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |
9367e029 |
84 | |
5d5a3b5d |
85 | $lazy_builder_called = 0; |
9367e029 |
86 | my $object4 = Class->new(age => 50); |
5d5a3b5d |
87 | ok($object4->has_age, "predicate: have value from constructor"); |
9367e029 |
88 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
89 | is($object4->age, 50, "value from constructor"); |
90 | is($lazy_builder_called, 0, "lazy builder not called if value is from constructor"); |
91 | |
92 | $object4->clear_age; |
5d5a3b5d |
93 | ok(!$object4->has_age, "predicate: no value after clear"); |
9367e029 |
94 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
95 | is($object4->age, 20, "lazy builder value"); |
5d5a3b5d |
96 | ok($object4->has_age, "predicate: have value after clear and get"); |
9367e029 |
97 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |