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()

