0.01
[gitmo/MooseX-AttributeHelpers.git] / lib / MooseX / AttributeHelpers / Number.pm
1 package MooseX::AttributeHelpers::Number;
2 use Moose;
3
4 our $VERSION   = '0.01';
5 our $AUTHORITY = 'cpan:STEVAN';
6
7 extends 'MooseX::AttributeHelpers::Base';
8
9 sub helper_type { 'Num' }
10
11 has '+method_constructors' => (
12     default => sub {
13         return +{
14             set => sub {
15                 my $attr = shift;
16                 return sub { $attr->set_value($_[0], $_[1]) };
17             },
18             add => sub {
19                 my $attr = shift;
20                 return sub { $attr->set_value($_[0], $attr->get_value($_[0]) + $_[1]) };
21             },
22             sub => sub {
23                 my $attr = shift;
24                 return sub { $attr->set_value($_[0], $attr->get_value($_[0]) - $_[1]) };
25             },
26             mul => sub {
27                 my $attr = shift;
28                 return sub { $attr->set_value($_[0], $attr->get_value($_[0]) * $_[1]) };
29             },
30             div => sub {
31                 my $attr = shift;
32                 return sub { $attr->set_value($_[0], $attr->get_value($_[0]) / $_[1]) };
33             },
34             mod => sub {
35                 my $attr = shift;
36                 return sub { $attr->set_value($_[0], $attr->get_value($_[0]) % $_[1]) };
37             },
38             abs => sub {
39                 my $attr = shift;
40                 return sub { $attr->set_value($_[0], abs($attr->get_value($_[0])) ) };
41             },
42         }
43     }
44 );
45     
46 no Moose;
47
48 # register the alias ...
49 package Moose::Meta::Attribute::Custom::Number;
50 sub register_implementation { 'MooseX::AttributeHelpers::Number' }
51
52 1;
53
54 =pod
55
56 =head1 NAME
57
58 MooseX::AttributeHelpers::Number
59
60 =head1 SYNOPSIS
61   
62   package Real;
63   use Moose;
64   use MooseX::AttributeHelpers;
65   
66   has 'integer' => (
67       metaclass => 'Number',
68       is        => 'ro',
69       isa       => 'Int',
70       default   => sub { 5 },
71       provides  => {
72           set => 'set',
73           add => 'add',
74           sub => 'sub',
75           mul => 'mul',
76           div => 'div',
77           mod => 'mod',
78           abs => 'abs',
79       }
80   );
81
82   my $real = Real->new();
83   $real->add(5); # same as $real->integer($real->integer + 5);
84   $real->sub(2); # same as $real->integer($real->integer - 2);  
85   
86 =head1 DESCRIPTION
87
88 This provides a simple numeric attribute, which supports most of the
89 basic math operations.
90
91 =head1 METHODS
92
93 =over 4
94
95 =item B<helper_type>
96
97 =item B<method_constructors>
98
99 =back
100
101 =head1 BUGS
102
103 All complex software has bugs lurking in it, and this module is no 
104 exception. If you find a bug please either email me, or add the bug
105 to cpan-RT.
106
107 =head1 AUTHOR
108
109 Robert Boone
110
111 =head1 COPYRIGHT AND LICENSE
112
113 Copyright 2007 by Infinity Interactive, Inc.
114
115 L<http://www.iinteractive.com>
116
117 This library is free software; you can redistribute it and/or modify
118 it under the same terms as Perl itself.
119
120 =cut