summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Larson <chris_larson@mentor.com>2011-03-29 14:59:22 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-06-28 13:53:13 +0100
commit6a46c375bea03b145bea41ec29ae2fd4d3cd9db6 (patch)
tree27126b838c274d94c645d76ec2f9ccd59d322834
parent1c8c893864afd91d4a0e5858bfe44ae9a4b33cef (diff)
downloadopenembedded-core-6a46c375bea03b145bea41ec29ae2fd4d3cd9db6.tar.gz
openembedded-core-6a46c375bea03b145bea41ec29ae2fd4d3cd9db6.tar.bz2
openembedded-core-6a46c375bea03b145bea41ec29ae2fd4d3cd9db6.zip
oe.classutils: add module
This adds a ClassRegistry utility metaclass, as maintaining a class registry is a fairly common thing to do. Signed-off-by: Chris Larson <chris_larson@mentor.com>
-rw-r--r--meta/lib/oe/classutils.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/meta/lib/oe/classutils.py b/meta/lib/oe/classutils.py
new file mode 100644
index 0000000000..58188fdd6e
--- /dev/null
+++ b/meta/lib/oe/classutils.py
@@ -0,0 +1,43 @@
+class ClassRegistry(type):
+ """Maintain a registry of classes, indexed by name.
+
+Note that this implementation requires that the names be unique, as it uses
+a dictionary to hold the classes by name.
+
+The name in the registry can be overridden via the 'name' attribute of the
+class, and the 'priority' attribute controls priority. The prioritized()
+method returns the registered classes in priority order.
+
+Subclasses of ClassRegistry may define an 'implemented' property to exert
+control over whether the class will be added to the registry (e.g. to keep
+abstract base classes out of the registry)."""
+ priority = 0
+ class __metaclass__(type):
+ """Give each ClassRegistry their own registry"""
+ def __init__(cls, name, bases, attrs):
+ cls.registry = {}
+ type.__init__(cls, name, bases, attrs)
+
+ def __init__(cls, name, bases, attrs):
+ super(ClassRegistry, cls).__init__(name, bases, attrs)
+ try:
+ if not cls.implemented:
+ return
+ except AttributeError:
+ pass
+
+ try:
+ cls.name
+ except AttributeError:
+ cls.name = name
+ cls.registry[cls.name] = cls
+
+ @classmethod
+ def prioritized(tcls):
+ return sorted(tcls.registry.values(),
+ key=lambda v: v.priority, reverse=True)
+
+ def unregister(cls):
+ for key in cls.registry.keys():
+ if cls.registry[key] is cls:
+ del cls.registry[key]