Begin adding support for has +name
[gitmo/Mouse.git] / t / 023-builder.t
CommitLineData
b6e1128f 1#!/usr/bin/env perl
2use strict;
3use warnings;
010a2b16 4use Test::More tests => 34;
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 => (
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 46my $object = Class->new(name => "Bob");
5d5a3b5d 47ok($object->has_name, "predicate: value from constructor");
b6e1128f 48is($builder_called, 0, "builder not called in the constructor when we pass a value");
49is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor");
50$object->name("Bill");
51is($object->name, "Bill", "builder doesn't matter when we just set the value in writer");
52is($builder_called, 0, "builder not called in the setter");
53$builder_called = 0;
54
010a2b16 55$object->clear_name;
56ok(!$object->has_name, "predicate: no value after clear");
57is($object->name, undef, "eager builder does NOT swoop in after clear");
58ok(!$object->has_name, "predicate: no value after clear and get");
59is($builder_called, 0, "builder not called in the getter, even after clear");
60$builder_called = 0;
61
b6e1128f 62my $object2 = Class->new;
5d5a3b5d 63ok($object2->has_name, "predicate: value from eager builder");
b6e1128f 64is($object2->name, "FRANK", "builder called to provide the default value");
65is($builder_called, 1, "builder called ONCE to provide the default value");
66
9367e029 67# lazy builder
68my $object3 = Class->new;
69is($lazy_builder_called, 0, "lazy builder not called yet");
5d5a3b5d 70ok(!$object3->has_age, "predicate: no age yet");
9367e029 71is($object3->age, 20, "lazy builder value");
5d5a3b5d 72ok($object3->has_age, "predicate: have value after get");
9367e029 73is($lazy_builder_called, 1, "lazy builder called on get");
74is($object3->age, 20, "lazy builder value");
75is($lazy_builder_called, 1, "lazy builder not called on subsequent gets");
5d5a3b5d 76ok($object3->has_age, "predicate: have value after subsequent gets");
9367e029 77
5d5a3b5d 78$lazy_builder_called = 0;
9367e029 79$object3->clear_age;
5d5a3b5d 80ok(!$object3->has_age, "predicate: no value after clear");
81is($lazy_builder_called, 0, "lazy builder not called on clear");
9367e029 82is($object3->age, 20, "lazy builder value");
5d5a3b5d 83ok($object3->has_age, "predicate: have value after clear and get");
84is($lazy_builder_called, 1, "lazy builder called on get after clear");
9367e029 85
5d5a3b5d 86$lazy_builder_called = 0;
9367e029 87my $object4 = Class->new(age => 50);
5d5a3b5d 88ok($object4->has_age, "predicate: have value from constructor");
9367e029 89is($lazy_builder_called, 0, "lazy builder not called yet");
90is($object4->age, 50, "value from constructor");
91is($lazy_builder_called, 0, "lazy builder not called if value is from constructor");
92
93$object4->clear_age;
5d5a3b5d 94ok(!$object4->has_age, "predicate: no value after clear");
9367e029 95is($lazy_builder_called, 0, "lazy builder not called on clear");
96is($object4->age, 20, "lazy builder value");
5d5a3b5d 97ok($object4->has_age, "predicate: have value after clear and get");
9367e029 98is($lazy_builder_called, 1, "lazy builder called on get after clear");