def __init__(self, meta=None, fields=tuple()): if meta is None: meta = {} self.meta = meta self.fields = list(fields) self.instances = WeakCollection() # Each set of linked subfields means that those subfields are linked and share the same instance self.links = DisjointSets()
class Class(object): def __init__(self, meta=None, fields=tuple()): if meta is None: meta = {} self.meta = meta self.fields = list(fields) self.instances = WeakCollection() # Each set of linked subfields means that those subfields are linked and share the same instance self.links = DisjointSets() def __repr__(self): return '<%s, meta=%r, fields=%r>' % (self.__class__.__name__, self.meta, len(self.fields)) def add_field(self, field): self.fields.append(field) for instance in self.instances: instance.new_field(field) def create_instance(self, **kw): instance = Instance(self, **kw) self.instances.add(instance) return instance def union(self, src_subfield_hierarchy, dst_subfield_hierarchy): src_subfield_hierarchy = tuple(src_subfield_hierarchy) dst_subfield_hierarchy = tuple(dst_subfield_hierarchy) self.links.union(src_subfield_hierarchy, dst_subfield_hierarchy) assert dst_subfield_hierarchy in self.links.set_of(src_subfield_hierarchy) assert src_subfield_hierarchy in self.links.set_of(dst_subfield_hierarchy) for instance in self.instances: # Find the subfield's_instance for this instance (extract the instance from the deepest level) src_subfield_instance = instance.get_subfield_instance(src_subfield_hierarchy, False) # Tell the instance that the subfield has changed, it will update all internally linked fields to point # to the new instance. instance.subfield_linked(src_subfield_hierarchy, src_subfield_instance) def split(self, subfield_hierarchy): self.links.split(subfield_hierarchy) for instance in self.instances: instance.subfield_unlinked(subfield_hierarchy)