"""
$Id: singleton.py,v 1.4 2005/06/09 00:24:02 gimblefoot Exp $
Singleton class - could use a lot of work but it does the job for now.
Copyright (C) 2005 Tom Warkentin <tom@ixionstudios.com>
"""
import sre
import mythtvutil
global gSingletons
gSingletons = {}
def debug( str ):
mythtvutil.debug( mythtvutil.DEBUG_MISC, str )
def delInstance( t ):
"""
Method to destroy a previously created singleton instance. Does nothing
if the singleton instance has not been created yet.
"""
debug( "> singleton.delInstance( t=[%s])"%t )
tstr = sre.match( '.*\.(\w+)', str(t) )
tstr = tstr.group(1)
if tstr in gSingletons:
debug( "id=[%d]"% id(gSingletons[tstr]) )
obj = globals()['gSingletons'][tstr]
del globals()['gSingletons'][tstr]
del obj
debug( "< singleton.delInstance( t=[%s])"%t )
def getInstance( t ):
"""
Method to create a singleton instance of an object. If the object has
already been instantiated, it returns the already instantiated object.
"""
debug( "> singleton.getInstance( t=[%s])"%t )
tstr = sre.match( '.*\.(\w+)', str(t) )
tstr = tstr.group(1)
obj = None
if not tstr in gSingletons:
obj = object.__new__( t )
globals()['gSingletons'][tstr] = obj
debug( "new singleton tstr=[%s] id=[%d]"%(tstr,id(obj)) )
obj.__init__()
else:
obj = gSingletons[tstr]
if hasattr( obj, 'testActive' ):
if not obj.testActive():
obj = None
delInstance( t )
obj = getInstance( t )
debug( "< singleton.getInstance( t=[%s] ) => [%s]"%(t,obj) )
return obj
################################################################################
# For testing purposes
################################################################################
if __name__ == "__main__":
import unittest
mythtvutil.debugSetLevel( mythtvutil.DEBUG_ALL )
class PublicInterfaceTest( unittest.TestCase ):
def testReturnsSameObject( self ):
class A(object):
def __init__( self ):
debug( "> A.__init__" )
debug( "< A.__init__" )
a1 = getInstance( A )
a2 = getInstance( A )
self.assertEquals( id(a1), id(a2) )
def testDestroySingleton( self ):
class B(object):
def __init__( self ):
debug( "> B.__init__" )
debug( "< B.__init__" )
b1 = getInstance( B )
delInstance( B )
unittest.main()
|