Commit | Line | Data |
b6e1128f |
1 | #!/usr/bin/env perl |
2 | use strict; |
3 | use warnings; |
9367e029 |
4 | use Test::More tests => 20; |
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 => ( |
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 |
43 | my $object = Class->new(name => "Bob"); |
44 | is($builder_called, 0, "builder not called in the constructor when we pass a value"); |
45 | is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor"); |
46 | $object->name("Bill"); |
47 | is($object->name, "Bill", "builder doesn't matter when we just set the value in writer"); |
48 | is($builder_called, 0, "builder not called in the setter"); |
49 | $builder_called = 0; |
50 | |
51 | my $object2 = Class->new; |
52 | is($object2->name, "FRANK", "builder called to provide the default value"); |
53 | is($builder_called, 1, "builder called ONCE to provide the default value"); |
54 | |
9367e029 |
55 | # lazy builder |
56 | my $object3 = Class->new; |
57 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
58 | is($object3->age, 20, "lazy builder value"); |
59 | is($lazy_builder_called, 1, "lazy builder called on get"); |
60 | is($object3->age, 20, "lazy builder value"); |
61 | is($lazy_builder_called, 1, "lazy builder not called on subsequent gets"); |
62 | |
63 | $object3->clear_age; |
64 | is($lazy_builder_called, 1, "lazy builder not called on clear"); |
65 | is($object3->age, 20, "lazy builder value"); |
66 | is($lazy_builder_called, 2, "lazy builder called on get after clear"); |
67 | |
68 | $lazy_builder_called = 0 ; |
69 | my $object4 = Class->new(age => 50); |
70 | is($lazy_builder_called, 0, "lazy builder not called yet"); |
71 | is($object4->age, 50, "value from constructor"); |
72 | is($lazy_builder_called, 0, "lazy builder not called if value is from constructor"); |
73 | |
74 | $object4->clear_age; |
75 | is($lazy_builder_called, 0, "lazy builder not called on clear"); |
76 | is($object4->age, 20, "lazy builder value"); |
77 | is($lazy_builder_called, 1, "lazy builder called on get after clear"); |