renamed helper_type => _helper_type
[gitmo/Moose.git] / t / 070_attribute_helpers / 100_collection_with_roles.t
CommitLineData
e3c07b19 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 29;
7
8BEGIN {
9 use_ok('Moose::AttributeHelpers');
10}
11
12package Subject;
13
14use Moose::Role;
15use Moose::AttributeHelpers;
16
17has observers => (
3e928ab1 18 traits => [ 'Collection::Array' ],
e3c07b19 19 is => 'ro',
20 isa => 'ArrayRef[Observer]',
21 auto_deref => 1,
22 default => sub { [] },
3e928ab1 23 handles => {
24 'add_observer' => 'push',
25 'count_observers' => 'count',
26 },
e3c07b19 27);
28
29sub notify {
30 my ($self) = @_;
31 foreach my $observer ( $self->observers() ) {
32 $observer->update($self);
33 }
34}
35
36###############################################################################
37
38package Observer;
39
40use Moose::Role;
41
42requires 'update';
43
44###############################################################################
45
46package Counter;
47
48use Moose;
49use Moose::AttributeHelpers;
50
51with 'Subject';
52
53has count => (
fe853e20 54 traits => [ 'Counter' ],
e3c07b19 55 is => 'ro',
56 isa => 'Int',
57 default => 0,
3e928ab1 58 handles => {
59 inc_counter => 'inc',
60 dec_counter => 'dec',
61 },
e3c07b19 62);
63
fe853e20 64after qw(inc_counter dec_counter) => sub {
e3c07b19 65 my ($self) = @_;
66 $self->notify();
67};
68
69###############################################################################
70
71package Display;
72
73use Test::More;
74
75use Moose;
76
77with 'Observer';
78
79sub update {
80 my ( $self, $subject ) = @_;
81 like $subject->count, qr{^-?\d+$}, 'Observed number ' . $subject->count;
82}
83
84###############################################################################
85
86package main;
87
88my $count = Counter->new();
89
90ok($count->can('add_observer'), 'add_observer method added');
91
92ok($count->can('count_observers'), 'count_observers method added');
93
94ok($count->can('inc_counter'), 'inc_counter method added');
95
96ok($count->can('dec_counter'), 'dec_counter method added');
97
98$count->add_observer( Display->new() );
99
100is($count->count_observers, 1, 'Only one observer');
101
102is($count->count, 0, 'Default to zero');
103
104$count->inc_counter;
105
106is($count->count, 1, 'Increment to one ');
107
108$count->inc_counter for (1 .. 6);
109
110is($count->count, 7, 'Increment up to seven');
111
112$count->dec_counter;
113
114is($count->count, 6, 'Decrement to 6');
115
116$count->dec_counter for (1 .. 5);
117
118is($count->count, 1, 'Decrement to 1');
119
120$count->dec_counter for (1 .. 2);
121
122is($count->count, -1, 'Negative numbers');
123
124$count->inc_counter;
125
3e928ab1 126is($count->count, 0, 'Back to zero');