By convention, a Perl5 class's constructor is typically written to create a new object by blessing a new anonymous hash (or other reference). (Smalltalkers will note the similarity between bless and a one-way #become:) Objects created in this manner are distinct.
Arranging to create and return a singleton object is straightforward: bless an object when the constructor (e.g. new) is first invoked, remember that object, and hand it out on subsequent invocations of the constructor.
[Singleton.pm] package Singleton; my $singleton; sub new { my $class = shift; $singleton ||= bless {}, $class; } ... [foo.pl] require Singleton; my $object1 = new Singleton; my $object2 = new Singleton;# same object!-- DaveSmith
Yet another way (I won't claim this is better, but it avoids any extra logic on subsequent calls to new):
package Foo; sub new { *new = \&old; $Foo::bar = bless {}, shift; } sub old { $Foo::bar; }
An alternative is to exploit the feature that perl classes are just namespaces (i.e. packages) with functions in them. Since every namespace is automatically unique in a perl program, it can be a singleton object itself. In this case, the "object" is the name of the class.
Like so:
my $sngl = 'Some::Singleton::Class'; $sngl->foo;as long as that subroutine exists in that package, everything works fine.
There are, of course, ways to wrap this approach in an abstraction that makes it look like normal (blessed-ref) object usage.
[Perl punctuation commentary follows]
The ||= operator is a handy lazy assignment operator which evaluates the rhs and assigns it to the lhs if and only if the lhs evaluates as false.
(The only "problem" is that || tests for truth, not definedness. However, references are always true, so there is no problem in this case.)
So equivalent long-hand notations include:
$singleton = bless {}, $class unless $singleton; $singleton or $singleton = bless {}, $class; $singleton = $singleton ? $singleton : bless {}, $class;Using these longer forms, you can test for definedness explicitly.
As always, ThereIsMoreThanOneWayToDoIt... but consider that ||= gives the lowest PerlGolf score ;-).
And since perl 5.9.0, you can use //= to test the definedness.
Contributors: IlmariKaronen, KirrilyRobert, JohnDouglasPorter, SlavenRezic
I do something like this now: 1. ClassName::ClassSingleton?() for access to a single instance of the class. 2. ClassName::Singleton(primary key) to get a cached version or create an object and then cache it.
I find these idioms easy and obvious. Being too clever isn't a win.
I find that "new" is inappropriate in a singleton API. My view is that you should not call a constructor, but instead a getInstance () method. That way, it's lucid in your client code that indeed you're dealing with a singleton. It will help you avoid hours of searching when you're wondering why several "new" objects are not really new at all.
hubo
Compare with PythonSingleton and RubySingleton