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
66
67
68
69
70
71
72
73
74
75
76
77
|
use strict;
use warnings;
use Test::More;
use Test::Requires 'Test::Output'; # skip all if not installed
# this test script ensures that my idiom of:
# role: sub BUILD, after BUILD
# continues to work to run code after object initialization, whether the class
# has a BUILD method or not
my @CALLS;
do {
package TestRole;
use Moose::Role;
sub BUILD { push @CALLS, 'TestRole::BUILD' }
before BUILD => sub { push @CALLS, 'TestRole::BUILD:before' };
after BUILD => sub { push @CALLS, 'TestRole::BUILD:after' };
};
do {
package ClassWithBUILD;
use Moose;
::stderr_is {
with 'TestRole';
} '';
sub BUILD { push @CALLS, 'ClassWithBUILD::BUILD' }
};
do {
package ExplicitClassWithBUILD;
use Moose;
::stderr_is {
with 'TestRole' => { -excludes => 'BUILD' };
} '';
sub BUILD { push @CALLS, 'ExplicitClassWithBUILD::BUILD' }
};
do {
package ClassWithoutBUILD;
use Moose;
with 'TestRole';
};
{
is_deeply([splice @CALLS], [], "no calls to BUILD yet");
ClassWithBUILD->new;
is_deeply([splice @CALLS], [
'TestRole::BUILD:before',
'ClassWithBUILD::BUILD',
'TestRole::BUILD:after',
]);
ClassWithoutBUILD->new;
is_deeply([splice @CALLS], [
'TestRole::BUILD:before',
'TestRole::BUILD',
'TestRole::BUILD:after',
]);
if (ClassWithBUILD->meta->is_mutable) {
ClassWithBUILD->meta->make_immutable;
ClassWithoutBUILD->meta->make_immutable;
redo;
}
}
done_testing;
|