Commit | Line | Data |
b6e1128f |
1 | #!/usr/bin/env perl |
2 | use strict; |
3 | use warnings; |
5d5a3b5d |
4 | use Test::More tests => 30; |
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', |
b6e1128f |
18 | ); |
19 | |
b6e1128f |
20 | sub _build_name { |
21 | my $self = shift; |
22 | ++$builder_called; |
9367e029 |
23 | return "FRANK"; |
b6e1128f |
24 | }; |
9367e029 |
25 | |
26 | has age => ( |
5d5a3b5d |
27 | is => 'ro', |
28 | isa => 'Int', |
29 | builder => '_build_age', |
30 | lazy => 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 | |
54 | my $object2 = Class->new; |
5d5a3b5d |
55 | ok($object2->has_name, "predicate: value from eager builder"); |
b6e1128f |
56 | is($object2->name, "FRANK", "builder called to provide the default value"); |
57 | is($builder_called, 1, "builder called ONCE to provide the default value"); |
58 | |
9367e029 |
59 | # lazy builder |
60 | my $object3 = Class->new; |
61 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
5d5a3b5d |
62 | ok(!$object3->has_age, "predicate: no age yet"); |
9367e029 |
63 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
64 | ok($object3->has_age, "predicate: have value after get"); |
9367e029 |
65 | is($lazy_builder_called, 1, "lazy builder called on get"); |
66 | is($object3->age, 20, "lazy builder value"); |
67 | is($lazy_builder_called, 1, "lazy builder not called on subsequent gets"); |
5d5a3b5d |
68 | ok($object3->has_age, "predicate: have value after subsequent gets"); |
9367e029 |
69 | |
5d5a3b5d |
70 | $lazy_builder_called = 0; |
9367e029 |
71 | $object3->clear_age; |
5d5a3b5d |
72 | ok(!$object3->has_age, "predicate: no value after clear"); |
73 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
9367e029 |
74 | is($object3->age, 20, "lazy builder value"); |
5d5a3b5d |
75 | ok($object3->has_age, "predicate: have value after clear and get"); |
76 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |
9367e029 |
77 | |
5d5a3b5d |
78 | $lazy_builder_called = 0; |
9367e029 |
79 | my $object4 = Class->new(age => 50); |
5d5a3b5d |
80 | ok($object4->has_age, "predicate: have value from constructor"); |
9367e029 |
81 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
82 | is($object4->age, 50, "value from constructor"); |
83 | is($lazy_builder_called, 0, "lazy builder not called if value is from constructor"); |
84 | |
85 | $object4->clear_age; |
5d5a3b5d |
86 | ok(!$object4->has_age, "predicate: no value after clear"); |
9367e029 |
87 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
88 | is($object4->age, 20, "lazy builder value"); |
5d5a3b5d |
89 | ok($object4->has_age, "predicate: have value after clear and get"); |
9367e029 |
90 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |