jtulach@176: package org.apidesign.visitor; jtulach@176: jtulach@176: public final class Language { jtulach@176: private Language() { } jtulach@176: jtulach@176: // BEGIN: visitor.clientprovider.v1 jtulach@176: public interface Expression { jtulach@176: public abstract void visit(Visitor v); jtulach@176: } jtulach@176: public interface Plus extends Expression { jtulach@176: public Expression getFirst(); jtulach@176: public Expression getSecond(); jtulach@176: } jtulach@176: public interface Number extends Expression { jtulach@176: public int getValue(); jtulach@176: } jtulach@176: jtulach@176: public static abstract class Visitor { jtulach@176: Visitor() {} jtulach@176: jtulach@266: public static Visitor create(Version10 v) { jtulach@266: return create10(v); jtulach@176: } jtulach@176: jtulach@266: public interface Version10 { jtulach@176: public boolean visitUnknown(Expression e); jtulach@176: public void visitPlus(Plus s); jtulach@176: public void visitNumber(Number n); jtulach@176: } jtulach@176: jtulach@176: public abstract void dispatchPlus(Plus p); jtulach@176: public abstract void dispatchNumber(Number n); jtulach@176: } jtulach@176: // END: visitor.clientprovider.v1 jtulach@176: jtulach@266: static Visitor create10(final Visitor.Version10 v) { jtulach@176: return new Visitor() { jtulach@176: @Override jtulach@176: public void dispatchPlus(Plus p) { jtulach@176: v.visitPlus(p); jtulach@176: } jtulach@176: jtulach@176: @Override jtulach@176: public void dispatchNumber(Number n) { jtulach@176: v.visitNumber(n); jtulach@176: } jtulach@176: }; jtulach@176: } jtulach@176: }