    from threading import Lock

    class ParamFactory:
        def __init__(self, klass, **extraMethods):
            self.lock = Lock()
            self.cache = {}
            self.klass = klass
            for name, func in extraMethods.items():
                setattr(self, name, func)
        def __call__(self, *args):
            self.lock.acquire()
            if not self.cache.has_key(args):
                value = self.klass(*args)
                self.cache[args] = value
                self.lock.release()
                return value
            else:
                self.lock.release()
                return self.cache[args]
        def allInstances(self):
            return self.cache.values()