-
Notifications
You must be signed in to change notification settings - Fork 36
/
008-lazy-trait.t
65 lines (48 loc) · 1.4 KB
/
008-lazy-trait.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!perl
use strict;
use warnings;
use Test::More;
use Test::Fatal;
use mop;
class Foo {
has $foo = 10;
has $bar_touched is ro;
has $baz_touched is rw;
has $bar is ro, lazy = $_->_build_bar;
has $baz is ro, lazy = do {
$_->baz_touched(1);
$_->bar * 2
};
submethod _build_bar {
$bar_touched++;
$foo * 5;
}
method has_bar {
defined ${ ${^CLASS}->get_attribute('$bar')->storage->{ $self } || \undef }
}
method clear_bar {
$bar_touched--;
undef $bar;
}
}
for (1..2) {
my $foo = Foo->new;
isa_ok($foo, 'Foo');
ok(!$foo->has_bar, '... no bar yet');
ok(!$foo->bar_touched, '... no bar yet');
is($foo->bar, 50, '... bar has been generated');
ok($foo->has_bar, '... have bar yet');
is($foo->bar_touched, 1, '... bar was created');
is($foo->bar, 50, '... checking bar again');
is($foo->bar_touched, 1, '... the lazy builder did not fire');
$foo->clear_bar;
ok(!$foo->has_bar, '... no bar again');
is($foo->bar_touched, 0, '... we cleared bar');
is($foo->bar, 50, '... init bar again');
is($foo->bar_touched, 1, '... the lazy builder fired again');
ok($foo->has_bar, '... have bar yet');
ok(!$foo->baz_touched, '... no baz yet');
is($foo->baz, 100, '... baz has been generated');
ok($foo->baz_touched, '... baz was created');
}
done_testing;