package MooseX::Singleton;
-
use Moose::Role;
-our $VERSION = 0.01;
+our $VERSION = 0.02;
override new => sub {
- my ($class) = @_;
-
- no strict qw/refs/;
+ my ($class) = @_;
- my $instance = super;
+ no strict 'refs';
- ${"$class\::singleton"} = $instance;
+ # create our instance if we don't already have one
+ if (!defined ${"$class\::singleton"}) {
+ ${"$class\::singleton"} = super;
+ }
- return $instance;
+ return ${"$class\::singleton"};
};
+# instance really is the same as new. any ideas for a better implementation?
sub instance {
- my ($class) = @_;
-
- no strict qw/refs/;
-
- return ${"$class\::singleton"};
+ shift->new(@_);
}
1;
-use Test::More tests => 2;
+use Test::More tests => 4;
use strict;
use warnings;
{
- package Foo::Singleton;
+ package Foo::Singleton;
+ use Moose;
- use Moose;
+ with qw/MooseX::Singleton/;
- has gravy => (is => 'rw');
-
- with qw/MooseX::Singleton/;
+ has gravy => (is => 'rw');
}
-ok (Foo::Singleton->new,'new');
+my $ante = Foo::Singleton->instance;
-my $foo = Foo::Singleton->instance;
+ok(Foo::Singleton->new,'new');
+my $foo = Foo::Singleton->instance;
my $bar = Foo::Singleton->instance;
+my $baz = Foo::Singleton->new;
-$foo->gravy ('sauce');
+$foo->gravy('sauce');
-is ($bar->gravy,'sauce','singleton');
+is($bar->gravy,'sauce','singleton');
+is($baz->gravy,'sauce','singleton');
+is($ante->gravy,'sauce','singleton');