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

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

    has 'word_histogram' => (
        metaclass => 'Collection::Bag',
        provides  => {
            add    => 'add_word',
            delete => 'delete_word',
            reset  => 'reset_word',
            get    => 'get_count_for',
            empty  => 'has_any_words',
            count  => 'num_words',
        }
    );
}

my $obj = MyClass->new;

my @providers = qw(
    add_word delete_word reset_word
    get_count_for has_any_words num_words
);
for my $method (@providers) {
    can_ok $obj => $method;
}

ok !$obj->has_any_words, 'provides empty ok, have no words';
is $obj->num_words => 0, 'provides count ok, have no words';

$obj->add_word('bar');
ok $obj->has_any_words, 'provides add ok, have words';
is $obj->num_words => 1, 'provides add ok, have 1 word';
is $obj->get_count_for('bar') => 1, 'provides get ok';

$obj->add_word('foo');
$obj->add_word('bar') for 1..4;
$obj->add_word('baz') for 1..10;
is $obj->num_words => 3, 'have 3 words';
is $obj->get_count_for('foo') => 1, 'count foo is 1';
is $obj->get_count_for('bar') => 5, 'count bar is 5';
is $obj->get_count_for('baz') => 10, 'count baz is 10';

$obj->reset_word('bar');
is $obj->get_count_for('bar') => 0, 'provides reset ok, count bar is 0';
is $obj->num_words => 3, 'still have 3 words';

$obj->delete_word('bar');
is $obj->num_words => 2, 'provides delete ok, have 2 words';