The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
package MooseX::Singleton::Object;
use Moose;
use metaclass 'MooseX::Singleton::Meta::Class';

extends 'Moose::Object';

sub instance { shift->new }

sub initialize {
  my ($class, @args) = @_;

  my $existing = $class->meta->existing_singleton;
  confess "Singleton is already initialized" if $existing;

  return $class->SUPER::new(@args);
}

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);
}

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