The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl


use strict;
use warnings;

use Test::More tests => 26;

BEGIN {
    use_ok('MooseX::AttributeHelpers');   
}

{
    package Real;
    use Moose;

    has 'integer' => (
        metaclass => 'Number',
        is        => 'ro',
        isa       => 'Int',
        default   => sub { 5 },
        provides  => {
            set       => 'set',
            add       => 'add',
            sub       => 'sub',
            mul       => 'mul',
            div       => 'div',
            mod       => 'mod',
            abs       => 'abs',
        },
        curries   => {
            add       => {inc         => [ 1 ]},
            sub       => {dec         => [ 1 ]},
            mod       => {odd         => [ 2 ]},
            div       => {cut_in_half => [ 2 ]}
        }
    );
}

my $real = Real->new;
isa_ok($real, 'Real');

can_ok($real, $_) for qw[
    set add sub mul div mod abs inc dec odd cut_in_half
];

is $real->integer, 5, 'Default to five';

$real->add(10);

is $real->integer, 15, 'Add ten for fithteen';

$real->sub(3);

is $real->integer, 12, 'Subtract three for 12';

$real->set(10);

is $real->integer, 10, 'Set to ten';

$real->div(2);

is $real->integer, 5, 'divide by 2';

$real->mul(2);

is $real->integer, 10, 'multiplied by 2';

$real->mod(2);

is $real->integer, 0, 'Mod by 2';

$real->set(7);

$real->mod(5);

is $real->integer, 2, 'Mod by 5';

$real->set(-1);

$real->abs;

is $real->integer, 1, 'abs 1';

$real->set(12);

$real->inc;

is $real->integer, 13, 'inc 12';

$real->dec;

is $real->integer, 12, 'dec 13';

## test the meta

my $attr = $real->meta->get_attribute('integer');
isa_ok($attr, 'MooseX::AttributeHelpers::Number');

is_deeply($attr->provides, {
    set => 'set',
    add => 'add',
    sub => 'sub',
    mul => 'mul',
    div => 'div',
    mod => 'mod',
    abs => 'abs',
}, '... got the right provides mapping');