1use strict; use warnings;
2
3use Test::More tests => 6;
4
5{
6	package Something;
7	use Class::Observable;
8	our @ISA = 'Class::Observable';
9	sub new { bless {}, $_[0] }
10}
11
12my $test = Something->new;
13
14my %counter;
15
16sub obs_inst_1  { ++$counter{'inst'} }
17sub obs_inst_2  { ++$counter{'inst'} }
18sub obs_class_1 { ++$counter{'class'} }
19sub obs_class_2 { ++$counter{'class'} }
20
21$test->add_observer(\&obs_inst_1);
22$test->add_observer(\&obs_inst_2);
23
24Something->add_observer(\&obs_class_1);
25Something->add_observer(\&obs_class_2);
26
27$test->notify_observers;
28is $counter{'inst'}, 2, 'Both instance observers called';
29is $counter{'class'}, 2, '... as well as both class observers';
30%counter = ();
31
32$test->delete_observer(\&obs_inst_1);
33
34$test->notify_observers;
35is $counter{'inst'}, 1, 'After instance observer deletion only one is called';
36is $counter{'class'}, 2, '... as well as both class observers';
37%counter = ();
38
39Something->delete_observer(\&obs_class_1);
40
41$test->notify_observers;
42is $counter{'class'}, 1, 'After class observer deletion only one is called';
43is $counter{'inst'}, 1, '... as well as one instance observers';
44%counter = ();
45