my ($self, $instance) = @_;
return $instance if blessed $instance;
- return $instance->instance;
+
+ # optimization: it's really slow to go through new_object for every access
+ # so return the singleton if we see it already exists, which it will every
+ # single except the first.
+ no strict 'refs';
+ return ${"$instance\::singleton"} if defined ${"$instance\::singleton"};
+
+ return $instance->meta->construct_instance;
}
sub clone_instance {
sprintf "%s->meta->instance_metaclass->get_singleton_instance(%s)->{%s}", $instance, $instance, $slot_name;
}
+no Moose;
+
1;
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton::Meta::Instance
+
+=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).
+
+=cut
+