visitor call self.visit(c) rather than c.accept(self) to allow overriding