]> code.delx.au - bg-scripts/blob - lib/Enum.py
RandomBG: Make Listener non-writeable
[bg-scripts] / lib / Enum.py
1 #! python
2 # Copyright 2007 Greg Darke <gdar9540@usyd.edu.au>
3 # Licensed for distribution under the GPL version 2, check COPYING for details
4 # An enum like interface
5
6 """
7 An enum like interface
8 """
9
10 __all__ = ('enum', )
11
12 import itertools
13
14 def enum(*args):
15 return EnumContainer(*args)
16
17 class EnumElement(object):
18 __slots__ = ('enumName', 'enumContainer')
19 def __init__(self, enumName, enumContainer):
20 self.enumName = enumName
21 self.enumContainer = enumContainer
22 def __repr__(self):
23 return '%s(%s)' % (self.__class__.__name__, self.enumName)
24 def __str__(self):
25 return self.enumName
26 def __eq__(self, other):
27 if not isinstance(other, self.__class__): return NotImplemented
28 return other is self
29 def __hash__(self):
30 return hash(self.enumName) ^ hash(self.enumContainer)
31
32 class EnumContainer(object):
33 def __init__(self, *enums):
34 self.enumList = tuple( EnumElement(enumName, self) for enumName in enums)
35 for enumName, enumElement in itertools.izip(enums, self.enumList):
36 setattr(self, enumName, enumElement)
37
38 def __contains__(self, enum):
39 return enum in self.enumList
40
41 def __repr__(self):
42 return '%s(%s)' % (self.__class__.__name__, ', '.join(self.enumList))
43
44 def explode(self):
45 """Places contents of this enum into the callers global namespace"""
46 import inspect
47 frameObject, _, _, _, _ = inspect.stack[1] # The stackframe of who called us
48 global_dict = frameObject.f_globals
49 del frameObject
50 for enum in self.enumList:
51 if str(enum) in global_dict:
52 raise ValueError, '%s is already in your global dict' % enum
53 for enum in self.enumList:
54 global_dict[str(enum)] = enum