File Coverage

lib/Class/Singleton.pm
Criterion Covered Total %
statement 24 25 96.0
branch 4 6 66.6
condition 3 6 50.0
subroutine 7 7 100.0
pod 2 2 100.0
total 40 46 86.9


line stmt bran cond sub pod time code
1             #============================================================================
2             #
3             # Class::Singleton.pm
4             #
5             # Implementation of a "singleton" module which ensures that a class has
6             # only one instance and provides global access to it. For a description
7             # of the Singleton class, see "Design Patterns", Gamma et al, Addison-
8             # Wesley, 1995, ISBN 0-201-63361-2
9             #
10             # Written by Andy Wardley
11             #
12             # Copyright (C) 1998-2008 Andy Wardley. All Rights Reserved.
13             # Copyright (C) 1998 Canon Research Centre Europe Ltd.
14             #
15             #============================================================================
16              
17             package Class::Singleton;
18             require 5.004;
19 1     1   25463 use strict;
  1         3  
  1         35  
20 1     1   7 use warnings;
  1         1  
  1         79  
21              
22             our $VERSION = 1.4;
23              
24              
25             #========================================================================
26             #
27             # instance()
28             #
29             # Module constructor. Creates an Class::Singleton (or derived) instance
30             # if one doesn't already exist. The instance reference is stored in the
31             # _instance variable of the $class package. This means that classes
32             # derived from Class::Singleton will have the variables defined in *THEIR*
33             # package, rather than the Class::Singleton package. The impact of this is
34             # that you can create any number of classes derived from Class::Singleton
35             # and create a single instance of each one. If the _instance variable
36             # was stored in the Class::Singleton package, you could only instantiate
37             # *ONE* object of *ANY* class derived from Class::Singleton. The first
38             # time the instance is created, the _new_instance() constructor is called
39             # which simply returns a reference to a blessed hash. This can be
40             # overloaded for custom constructors. Any addtional parameters passed to
41             # instance() are forwarded to _new_instance().
42             #
43             # Returns a reference to the existing, or a newly created Class::Singleton
44             # object. If the _new_instance() method returns an undefined value
45             # then the constructer is deemed to have failed.
46             #
47             #========================================================================
48              
49             sub instance {
50 11     11 1 5004 my $class = shift;
51            
52             # already got an object
53 11 50       25 return $class if ref $class;
54              
55             # we store the instance in the _instance variable in the $class package.
56 1     1   6 no strict 'refs';
  1         6  
  1         159  
57 11         12 my $instance = \${ "$class\::_instance" };
  11         30  
58 11 100       44 defined $$instance
59             ? $$instance
60             : ($$instance = $class->_new_instance(@_));
61             }
62              
63              
64             #=======================================================================
65             # has_instance()
66             #
67             # Public method to return the current instance if it exists.
68             #=======================================================================
69              
70             sub has_instance {
71 4     4 1 1562 my $class = shift;
72 4   33     22 $class = ref $class || $class;
73 1     1   7 no strict 'refs';
  1         2  
  1         115  
74 4         5 return ${"$class\::_instance"};
  4         24  
75             }
76              
77              
78             #========================================================================
79             # _new_instance(...)
80             #
81             # Simple constructor which returns a hash reference blessed into the
82             # current class. May be overloaded to create non-hash objects or
83             # handle any specific initialisation required.
84             #========================================================================
85              
86             sub _new_instance {
87 4     4   8 my $class = shift;
88 4 50 66     17 my %args = @_ && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_;
  0         0  
89 4         160 bless { %args }, $class;
90             }
91              
92              
93              
94             1;
95              
96             __END__