--- /dev/null
+#! python
+# Copyright 2007 Greg Darke <gdar9540@usyd.edu.au>
+# Licensed for distribution under the GPL version 2, check COPYING for details
+# An enum like interface
+
+"""
+An enum like interface
+"""
+
+__all__ = ('enum', )
+
+import itertools
+
+def enum(*args):
+ return EnumContainer(*args)
+
+class EnumElement(object):
+ __slots__ = ('enumName', 'enumContainer')
+ def __init__(self, enumName, enumContainer):
+ self.enumName = enumName
+ self.enumContainer = enumContainer
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, self.enumName)
+ def __str__(self):
+ return self.enumName
+ def __eq__(self, other):
+ if not isinstance(other, self.__class__): return NotImplemented
+ return other is self
+ def __hash__(self):
+ return hash(self.enumName) ^ hash(self.enumContainer)
+
+class EnumContainer(object):
+ def __init__(self, *enums):
+ self.enumList = tuple( EnumElement(enumName, self) for enumName in enums)
+ for enumName, enumElement in itertools.izip(enums, self.enumList):
+ setattr(self, enumName, enumElement)
+
+ def __contains__(self, enum):
+ return enum in self.enumList
+
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, ', '.join(self.enumList))
+
+ def explode(self):
+ """Places contents of this enum into the callers global namespace"""
+ import inspect
+ frameObject, _, _, _, _ = inspect.stack[1] # The stackframe of who called us
+ global_dict = frameObject.f_globals
+ del frameObject
+ for enum in self.enumList:
+ if str(enum) in global_dict:
+ raise ValueError, '%s is already in your global dict' % enum
+ for enum in self.enumList:
+ global_dict[str(enum)] = enum