
class ObjectKey:
	"""An ObjectKey is used by ObjectStore for keeping track of objects in memory.

	Currently a key is equal to the class name of the object combined
	with the object's serial number, although as a user of object keys,
	you don't normally need to know what's inside them.

	"""

	def __init__(self):
		pass

	def initFromObject(self, object):
		"""Initialize from object.

		Initializes the key and potentially invokes object.setSerialNum()
		if the object does not have one. The key does not maintain a reference
		to either the object or the store.

		"""
		self._className = object.__class__.__name__
		self._serialNum = object.serialNum()
		if self._serialNum is 0:
			self._serialNum = object.store().newSerialNum()
			object.setSerialNum(self._serialNum)
		return self

	def initFromClassNameAndSerialNum(self, className, serialNum):
		assert className is not None
		assert serialNum > 0
		self._className = className
		self._serialNum = serialNum
		return self

	def serialNum(self):
		return self._serialNum

	def __cmp__(self, other):
		result = cmp(self._className, other._className)
		if result is 0:
			result = cmp(self._serialNum, other._serialNum)
		return result

	def __hash__(self):
		return hash(self._className) ^ hash(self._serialNum)

	def __str__(self):
		return '<%s, %s>' % (self._className, self._serialNum)
