#!/usr/bin/env perl
-package MooseX::Singleton::Meta::Instance;
-use Moose;
+package MooseX::Singleton::Role::Meta::Instance;
+use Moose::Role;
use Scalar::Util 'weaken';
-extends 'Moose::Meta::Instance';
-
sub get_singleton_instance {
my ($self, $instance) = @_;
return $instance->meta->name->new;
}
-sub clone_instance {
+override clone_instance => sub {
my ($self, $instance) = @_;
$self->get_singleton_instance($instance);
-}
+};
-sub get_slot_value {
+override get_slot_value => sub {
my ($self, $instance, $slot_name) = @_;
$self->is_slot_initialized($instance, $slot_name) ? $self->get_singleton_instance($instance)->{$slot_name} : undef;
-}
+};
-sub set_slot_value {
+override set_slot_value => sub {
my ($self, $instance, $slot_name, $value) = @_;
$self->get_singleton_instance($instance)->{$slot_name} = $value;
-}
+};
-sub deinitialize_slot {
+override deinitialize_slot => sub {
my ( $self, $instance, $slot_name ) = @_;
delete $self->get_singleton_instance($instance)->{$slot_name};
-}
+};
-sub is_slot_initialized {
+override is_slot_initialized => sub {
my ($self, $instance, $slot_name, $value) = @_;
exists $self->get_singleton_instance($instance)->{$slot_name} ? 1 : 0;
-}
+};
-sub weaken_slot_value {
+override weaken_slot_value => sub {
my ($self, $instance, $slot_name) = @_;
weaken $self->get_singleton_instance($instance)->{$slot_name};
-}
+};
-sub inline_slot_access {
+override inline_slot_access => sub {
my ($self, $instance, $slot_name) = @_;
sprintf "%s->meta->instance_metaclass->get_singleton_instance(%s)->{%s}", $instance, $instance, $slot_name;
-}
+};
no Moose;
=head1 NAME
-MooseX::Singleton::Meta::Instance
+MooseX::Singleton::Role::Meta::Instance - Instance metaclass role for MooseX::Singleton
=head1 DESCRIPTION
-This instance metaclass manages attribute access and storage. When accessing an
-attribute, it will convert a bare package to its cached singleton instance
-(creating it if necessary).
+This role overrides all object access so that it gets the appropriate
+singleton instance for the class.
=cut