def test_next_visitor(visitor): Visitor = visitor.make_visitor() @Visitor.mark class Test1: pass @Visitor.mark class Test2(Test1): pass class Visitor1(Visitor): pass class Visitor2(Visitor1): pass @Visitor2.bind(Test2) def Visitor2(self, node, next_visitor): return 'a' + next_visitor('f') @Visitor1.bind(Test2) def Visitor1(self, node, next_visitor): return 'b' + next_visitor('f') @Visitor2.bind(Test1) def Visitor2(self, node, next_visitor): return 'c' + next_visitor('f') @Visitor1.bind(Test1) def Visitor1(self, node, next_visitor): return 'd' + next_visitor('e') assert Visitor2().visit(Test2()) == 'abcde'