from metasqlobject.classinst import classinstancemethod from metasqlobject.declarative import counter __all__ = ['BoundAttribute'] class BoundAttribute(object): name = None bound_class = None def __init__(self, bound_class=None, name=None, _copyfrom=None, **kw): self.declarative_count = counter.next() if _copyfrom is not None: for k, v in _copyfrom.__dict__.items(): if (not k.startswith('__') and k != 'declarative_count'): setattr(self, k, v) if name is not None: self.name = name for k, v in kw.items(): setattr(self, k, v) if bound_class is not None: self.bound_class = bound_class def __repr__(self): s = '<%s object %s' % ( self.__class__.__name__, self.declarative_count) if self.bound_class: s += ' for %s.%s' % ( self.bound_class.__module__, self.bound_class.__name__) if self.name: s += ' name=%r' % self.name else: s += ' unnamed' s += self.extra_repr() s += '>' return s def extra_repr(self): return '' def __addtoclass__(self, cls, bound_class, name): if self is None: me = cls(bound_class=bound_class, name=name) else: me = self.__class__( bound_class=bound_class, name=name, _copyfrom=self) setattr(bound_class, name, me) me.bind_to_class(bound_class, name) bound_class.__addtosubclass__.append(name) __addtoclass__ = classinstancemethod(__addtoclass__) def bind_to_class(self, bound_class, name): pass