use strict; use warnings; use Test::More tests => 15; BEGIN { package MooseX::Singleton::Test; use MooseX::Singleton; has bag => ( is => 'rw', isa => 'HashRef[Int]', default => sub { { default => 42 } }, ); sub distinct_keys { my $self = shift; scalar keys %{ $self->bag }; } sub clear { my $self = shift; $self->bag({}); } sub add { my $self = shift; my $key = shift; my $value = @_ ? shift : 1; $self->bag->{$key} += $value; } } my $mst = MooseX::Singleton::Test->instance; isa_ok($mst, 'MooseX::Singleton::Test', 'Singleton->instance returns a real instance'); is($mst->distinct_keys, 1, "default keys"); $mst->add(foo => 10); is($mst->distinct_keys, 2, "added key"); $mst->add(bar => 5); is($mst->distinct_keys, 3, "added another key"); my $mst2 = MooseX::Singleton::Test->instance; isa_ok($mst2, 'MooseX::Singleton::Test', 'Singleton->instance returns a real instance'); is($mst2->distinct_keys, 3, "keys from before"); $mst->add(baz => 2); is($mst->distinct_keys, 4, "attributes are shared even after ->instance"); is($mst2->distinct_keys, 4, "attributes are shared even after ->instance"); is(MooseX::Singleton::Test->distinct_keys, 4, "Package->reader works"); MooseX::Singleton::Test->add(quux => 9000); is($mst->distinct_keys, 5, "Package->add works"); is($mst2->distinct_keys, 5, "Package->add works"); is(MooseX::Singleton::Test->distinct_keys, 5, "Package->add works"); MooseX::Singleton::Test->clear; is($mst->distinct_keys, 0, "Package->clear works"); is($mst2->distinct_keys, 0, "Package->clear works"); is(MooseX::Singleton::Test->distinct_keys, 0, "Package->clear works");