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