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