The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 11;

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

    has 'value' => (
        metaclass => 'Counter',
        is        => 'rw',
        isa       => 'Int',
        default   => sub { 0 },
        provides  => { inc => 'inc' },
    );

    no Mouse;
    __PACKAGE__->meta->make_immutable;

    package Number;
    use Mouse;
    use MouseX::AttributeHelpers;

    has 'value' => (
        metaclass => 'Number',
        is        => 'rw',
        isa       => 'Int',
        default   => sub { 5 },
        provides  => { add => 'add' },
        curries   => { add => { inc => [ 1 ] } },
    );

    no Mouse;
    __PACKAGE__->meta->make_immutable;

    package String;
    use Mouse;
    use MouseX::AttributeHelpers;

    has 'value' => (
        metaclass => 'String',
        is        => 'rw',
        isa       => 'Str',
        default   => sub { '' },
        provides  => { append => 'append' },
        curries   => { append => { exclaim => [ '!' ] } },
    );

    no Mouse;
    __PACKAGE__->meta->make_immutable;

    package Bool;
    use Mouse;
    use MouseX::AttributeHelpers;

    has 'has_value' => (
        metaclass => 'Bool',
        is        => 'rw',
        isa       => 'Bool',
        default   => sub { 0 },
        provides  => { toggle => 'toggle' },
    );

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

my $counter = Counter->new;
is $counter->value => 0, 'counter default ok';
$counter->inc;
is $counter->value => 1, 'counter inc ok';

my $number = Number->new;
is $number->value => 5, 'number default ok';
$number->add(10);
is $number->value => 15, 'number add ok';
$number->inc;
is $number->value => 16, 'number curry(inc) ok';

my $string = String->new;
is $string->value => '', 'string default ok';
$string->append('foobar');
is $string->value => 'foobar', 'string append ok';
$string->exclaim;
is $string->value => 'foobar!', 'string curry(append) ok';

my $bool = Bool->new;
ok !$bool->has_value, 'bool default ok';
$bool->toggle;
ok $bool->has_value, 'bool toggle ok';
$bool->toggle;
ok !$bool->has_value, 'bool toggle again ok';