Visitor Pattern: AbstractVisitor : ConcreteVisitor. ConcreteVisitor = Data. A = B C. B : X | Y. X = . Y = . A { traverse(ConcreteVisitor v) { v.visit_A(this); b.traverse(v); c.traverse(v); } } B { traverse(ConcreteVisitor v) { v.visit_B(this); } } X { traverse(ConcreteVisitor v) { super.traverse(v); v.visit_X(this); }} AbstractVisitor { void visit_A(A host) {} void visit_B(B host) {} void visit_X(X host) {} } ConcreteVisitor { void visit_A(A host) { ... } void visit_X(X host) { ... use d ... } }