Bump to 0.21
[gitmo/MooseX-AttributeHelpers.git] / lib / MooseX / AttributeHelpers / Trait / Counter.pm
CommitLineData
7fc7e054 1
2package MooseX::AttributeHelpers::Trait::Counter;
3use Moose::Role;
4
9807aa66 5our $VERSION = '0.21';
cf0d1310 6$VERSION = eval $VERSION;
7fc7e054 7our $AUTHORITY = 'cpan:STEVAN';
8
9use MooseX::AttributeHelpers::MethodProvider::Counter;
10
cf0d1310 11with 'MooseX::AttributeHelpers::Trait::Base';
12
7fc7e054 13has 'method_provider' => (
14 is => 'ro',
15 isa => 'ClassName',
16 predicate => 'has_method_provider',
17 default => 'MooseX::AttributeHelpers::MethodProvider::Counter',
18);
19
20sub helper_type { 'Num' }
21
22before 'process_options_for_provides' => sub {
23 my ($self, $options, $name) = @_;
24
25 # Set some default attribute options here unless already defined
26 if ((my $type = $self->helper_type) && !exists $options->{isa}){
27 $options->{isa} = $type;
28 }
29
30 $options->{is} = 'ro' unless exists $options->{is};
31 $options->{default} = 0 unless exists $options->{default};
32};
33
34after 'check_provides_values' => sub {
35 my $self = shift;
36 my $provides = $self->provides;
37
38 unless (scalar keys %$provides) {
39 my $method_constructors = $self->method_constructors;
40 my $attr_name = $self->name;
41
42 foreach my $method (keys %$method_constructors) {
43 $provides->{$method} = ($method . '_' . $attr_name);
44 }
45 }
46};
47
48no Moose::Role;
49
7fc7e054 501;
51
cf0d1310 52__END__
53
54=pod
55
56=head1 NAME
57
58MooseX::AttributeHelpers::Counter
59
60=head1 SYNOPSIS
61
62 package MyHomePage;
63 use Moose;
64 use MooseX::AttributeHelpers;
65
66 has 'counter' => (
67 metaclass => 'Counter',
68 is => 'ro',
69 isa => 'Num',
70 default => sub { 0 },
71 provides => {
72 inc => 'inc_counter',
73 dec => 'dec_counter',
74 reset => 'reset_counter',
75 }
76 );
77
78 my $page = MyHomePage->new();
79 $page->inc_counter; # same as $page->counter($page->counter + 1);
80 $page->dec_counter; # same as $page->counter($page->counter - 1);
81
82=head1 DESCRIPTION
83
84This module provides a simple counter attribute, which can be
85incremented and decremeneted.
86
87If your attribute definition does not include any of I<is>, I<isa>,
88I<default> or I<provides> but does use the C<Counter> metaclass,
89then this module applies defaults as in the L</SYNOPSIS>
90above. This allows for a very basic counter definition:
91
92 has 'foo' => (metaclass => 'Counter');
93 $obj->inc_foo;
94
95=head1 METHODS
96
97=over 4
98
99=item B<meta>
100
101=item B<method_provider>
102
103=item B<has_method_provider>
104
105=item B<helper_type>
106
107=item B<process_options_for_provides>
108
109Run before its superclass method.
110
111=item B<check_provides_values>
112
113Run after its superclass method.
114
115=back
116
117=head1 PROVIDED METHODS
118
119It is important to note that all those methods do in place
120modification of the value stored in the attribute.
121
122=over 4
123
124=item I<set>
125
126Set the counter to the specified value.
127
128=item I<inc>
129
130Increments the value stored in this slot by 1. Providing an argument will
131cause the counter to be increased by specified amount.
132
133=item I<dec>
134
135Decrements the value stored in this slot by 1. Providing an argument will
136cause the counter to be increased by specified amount.
137
138=item I<reset>
139
140Resets the value stored in this slot to it's default value.
141
142=back
143
144=head1 BUGS
145
146All complex software has bugs lurking in it, and this module is no
147exception. If you find a bug please either email me, or add the bug
148to cpan-RT.
149
150=head1 AUTHOR
151
152Stevan Little E<lt>stevan@iinteractive.comE<gt>
153
154=head1 COPYRIGHT AND LICENSE
155
9c5d164e 156Copyright 2007-2009 by Infinity Interactive, Inc.
cf0d1310 157
158L<http://www.iinteractive.com>
159
160This library is free software; you can redistribute it and/or modify
161it under the same terms as Perl itself.
162
163=cut