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 'counter' => (
        metaclass => 'Counter',
        is        => 'ro',
        isa       => 'Int',
        default   => 0,
        provides  => {
            inc   => 'inc_counter',
            dec   => 'dec_counter',
            reset => 'reset_counter',
            set   => 'set_counter',
        },
    );

    package MyImmutableClass;
    use Mouse;
    use MouseX::AttributeHelpers;

    has 'counter' => (
        metaclass => 'Counter',
        is        => 'ro',
        isa       => 'Int',
        default   => 0,
        provides  => {
            inc   => 'inc_counter',
            dec   => 'dec_counter',
            reset => 'reset_counter',
            set   => 'set_counter',
        },
    );

    no Mouse;
    __PACKAGE__->meta->make_immutable;
};

for my $class (qw/MyClass MyImmutableClass/) {
    my $obj = $class->new;

    my @providers = qw(inc_counter dec_counter reset_counter set_counter);
    for my $provider (@providers) {
        can_ok $obj => $provider;
    }

    is $obj->counter => 0, 'get default value ok';

    $obj->inc_counter;
    is $obj->counter => 1, 'increment ok';

    $obj->inc_counter;
    is $obj->counter => 2, 'increment again ok';

    $obj->dec_counter;
    is $obj->counter => 1, 'decrement ok';

    $obj->reset_counter;
    is $obj->counter => 0, 'reset ok';

    $obj->set_counter(5);
    is $obj->counter => 5, 'set value ok';

    $obj->inc_counter(2);
    is $obj->counter => 7, 'increment with count ok';

    $obj->dec_counter(5);
    is $obj->counter => 2, 'decrement with count ok';
}