#!/usr/bin/env perl
package MooseX::Singleton::Object;
use Moose;
-use metaclass 'MooseX::Singleton::Meta::Class';
extends 'Moose::Object';
-no strict 'refs';
+sub instance { shift->new }
-override new => sub {
- my $class = shift;
+sub initialize {
+ my ($class, @args) = @_;
- # create exactly one instance
- if (!defined ${"$class\::singleton"}) {
- ${"$class\::singleton"} = super;
- }
+ my $existing = $class->meta->existing_singleton;
+ confess "Singleton is already initialized" if $existing;
- return ${"$class\::singleton"};
-};
+ return $class->SUPER::new(@args);
+}
-sub instance { shift->new }
+sub new {
+ my ($class, @args) = @_;
+
+ my $existing = $class->meta->existing_singleton;
+ confess "Singleton is already initialized" if $existing and @args;
+
+ # Otherwise BUILD will be called repeatedly on the existing instance.
+ # -- rjbs, 2008-02-03
+ return $existing if $existing and ! @args;
+
+ return $class->SUPER::new(@args);
+}
+
+sub _clear_instance {
+ my ($class) = @_;
+ $class->meta->clear_singleton;
+}
+
+no Moose;
1;
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton::Object - base class for MooseX::Singleton
+
+=head1 DESCRIPTION
+
+This just adds C<instance> as a shortcut for C<new>.
+
+=cut
+