""" $Id: TreeBuilder.py,v 1.1 2000/10/08 16:48:55 kmacleod Exp $ """ class TreeBuilder: def __init__(self): self.node_stack = [] def __getattr__(self, name): if name[0:5] == 'start': start_builder = TreeBuilder._StartBuilder(self) setattr(self, name, start_builder) return start_builder elif name[0:3] == 'end': end_builder = TreeBuilder._EndBuilder(self) setattr(self, name, end_builder) return end_builder else: builder = TreeBuilder._Builder(self) setattr(self, name, builder) return builder class _StartBuilder: def __init__(self, builder): self._builder = builder def __call__(self, node): if len(self._builder.node_stack) != 0: self._builder.node_stack[-1].contents.append(node) self._builder.node_stack.append(node) class _Builder: def __init__(self, builder): self._builder = builder def __call__(self, node): if len(self._builder.node_stack) == 0: raise TypeError, "Data event received before any start* events.\n"; self._builder.node_stack[-1].contents.append(node) class _EndBuilder: def __init__(self, builder): self._builder = builder def __call__(self, node): return self._builder.node_stack.pop()