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 => ( |
5d5a3b5d |
28 | is => 'ro', |
29 | isa => 'Int', |
30 | builder => '_build_age', |
31 | lazy => 1, |
32 | clearer => 'clear_age', |
33 | predicate => 'has_age', |
9367e029 |
34 | ); |
35 | |
36 | sub default_age { 20 } |
37 | sub _build_age { |
38 | my $self = shift; |
39 | ++$lazy_builder_called; |
40 | return $self->default_age; |
41 | }; |
42 | |
b6e1128f |
43 | }; |
44 | |
9367e029 |
45 | # eager builder |
b6e1128f |
46 | my $object = Class->new(name => "Bob"); |
5d5a3b5d |
47 | ok($object->has_name, "predicate: value from constructor"); |
b6e1128f |
48 | is($builder_called, 0, "builder not called in the constructor when we pass a value"); |
49 | is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor"); |
50 | $object->name("Bill"); |
51 | is($object->name, "Bill", "builder doesn't matter when we just set the value in writer"); |
52 | is($builder_called, 0, "builder not called in the setter"); |
53 | $builder_called = 0; |
54 | |
010a2b16 |
55 | $object->clear_name; |
56 | ok(!$object->has_name, "predicate: no value after clear"); |
57 | is($object->name, undef, "eager builder does NOT swoop in after clear"); |
58 | ok(!$object->has_name, "predicate: no value after clear and get"); |
59 | is($builder_called, 0, "builder not called in the getter, even after clear"); |
60 | $builder_called = 0; |
61 | |
b6e1128f |
62 | my $object2 = Class->new; |
5d5a3b5d |
63 | ok($object2->has_name, "predicate: value from eager builder"); |
b6e1128f |
64 | is($object2->name, "FRANK", "builder called to provide the default value"); |
65 | is($builder_called, 1, "builder called ONCE to provide the default value"); |
66 | |
9367e029 |
67 | # lazy builder |
68 | my $object3 = Class->new; |
69 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
5d5a3b5d |
70 | ok(!$object3->has_age, "predicate: no age yet"); |
9367e029 |
71 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
72 | ok($object3->has_age, "predicate: have value after get"); |
9367e029 |
73 | is($lazy_builder_called, 1, "lazy builder called on get"); |
74 | is($object3->age, 20, "lazy builder value"); |
75 | is($lazy_builder_called, 1, "lazy builder not called on subsequent gets"); |
5d5a3b5d |
76 | ok($object3->has_age, "predicate: have value after subsequent gets"); |
9367e029 |
77 | |
5d5a3b5d |
78 | $lazy_builder_called = 0; |
9367e029 |
79 | $object3->clear_age; |
5d5a3b5d |
80 | ok(!$object3->has_age, "predicate: no value after clear"); |
81 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
9367e029 |
82 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
83 | ok($object3->has_age, "predicate: have value after clear and get"); |
84 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |
9367e029 |
85 | |
5d5a3b5d |
86 | $lazy_builder_called = 0; |
9367e029 |
87 | my $object4 = Class->new(age => 50); |
5d5a3b5d |
88 | ok($object4->has_age, "predicate: have value from constructor"); |
9367e029 |
89 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
90 | is($object4->age, 50, "value from constructor"); |
91 | is($lazy_builder_called, 0, "lazy builder not called if value is from constructor"); |
92 | |
93 | $object4->clear_age; |
5d5a3b5d |
94 | ok(!$object4->has_age, "predicate: no value after clear"); |
9367e029 |
95 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
96 | is($object4->age, 20, "lazy builder value"); |
5d5a3b5d |
97 | ok($object4->has_age, "predicate: have value after clear and get"); |
9367e029 |
98 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |