23: Added base.Attribute class that determins the object association via class naming convention instead of through the _obj attribute

This commit is contained in:
Jason Gerard DeRose
2008-07-20 21:42:35 +00:00
parent f3faaf2d29
commit 6f58880dcd
2 changed files with 145 additions and 2 deletions
+74 -2
View File
@@ -21,6 +21,7 @@
Base classes for plug-in architecture and generative API.
"""
import re
import inspect
import exceptions
@@ -141,6 +142,53 @@ class Named(object):
name = property(__get_name)
class AbstractCommand(object):
def __call__(self):
print 'You called %s()' % self.name
class Attribute(Named):
__locked = False
__obj = None
def __init__(self):
m = re.match('^([a-z]+)__([a-z]+)$', self.__class__.__name__)
assert m
self.__obj_name = m.group(1)
self.__attr_name = m.group(2)
def __get_obj(self):
return self.__obj
obj = property(__get_obj)
def set_obj(self, obj=None):
if self.__locked:
raise exceptions.TwiceSetError(self.__class__.__name__, 'obj')
self.__locked = True
if obj is None:
return
assert isinstance(obj, Object)
assert obj.name == self.__obj_name
self.__obj = obj
def __get_obj_name(self):
return self.__obj_name
obj_name = property(__get_obj_name)
def __get_attr_name(self):
return self.__attr_name
attr_name = property(__get_attr_name)
class Method(AbstractCommand, Attribute):
def _get_name(self):
return '%s_%s' % (self.attr_name, self.obj_name)
class Property(Attribute):
def _get_name(self):
return self.attr_name
class WithObj(Named):
_obj = None
__obj = None
@@ -168,8 +216,7 @@ class Command(WithObj):
def __call__(self):
print 'You called %s()' % self.name
class Property(WithObj):
pass
class Object(Named):
__commands = None
@@ -187,6 +234,31 @@ class Object(Named):
commands = property(__get_commands, __set_commands)
class AttributeCollector(object):
def __init__(self):
self.__d = {}
def __getitem__(self, key):
assert isinstance(key, str)
if key not in self.__d:
self.__d[key] = {}
return self.__d[key]
def __iter__(self):
for key in self.__d:
yield key
def add(self, i):
assert isinstance(i, Attribute)
self[i.obj_name][i.attr_name] = i
def namespaces(self):
for key in self:
yield (key, NameSpace(self[key]))
class Collector(object):
def __init__(self):
self.__d = {}