The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use Test::More tests => 24;

do {
    package MyClass;
    use Mouse;
    use MouseX::AttributeHelpers;

    has 'integer' => (
        metaclass => 'Number',
        is        => 'rw',
        isa       => 'Int',
        default   => 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 $obj = MyClass->new;

my @providers = qw(set add sub mul div mod abs);
for my $method (@providers) {
    can_ok $obj => $method;
}

my @curries = qw(inc dec odd cut_in_half);
for my $method (@curries) {
    can_ok $obj => $method;
}

is $obj->integer => 5, 'get default value ok';

# provides
$obj->add(10);
is $obj->integer => 15, 'add ok';

$obj->sub(3);
is $obj->integer => 12, 'subtract ok';

$obj->set(10);
is $obj->integer => 10, 'set value ok';

$obj->div(2);
is $obj->integer => 5, 'divide ok';

$obj->mul(2);
is $obj->integer => 10, 'multiplied ok';

$obj->mod(2);
is $obj->integer => 0, 'mod ok';

$obj->set(7);
$obj->mod(5);
is $obj->integer => 2, 'set and mod ok';

$obj->set(-1);
$obj->abs;
is $obj->integer => 1, 'abs ok';

# curries
$obj->set(12);
$obj->inc;
is $obj->integer => 13, 'curries inc ok';

$obj->dec;
is $obj->integer => 12, 'curries dec ok';

$obj->cut_in_half;
is $obj->integer => 6, 'curries cut_in_half ok';

$obj->odd;
is $obj->integer => 0, 'curries odd ok';