package org.test4j.hamcrest.matcher.property.difference; /** * A visitor for visiting all types of differences. * <p/> * All difference classes should implement a double-dispatch method as follows: * <code><pre> * public <T, A> T accept(DifferenceVisitor<T, A> visitor, A argument) { * return visitor.visit(this, argument); * } * </pre></code> * <p/> * The visitor logic can the be invoked as follows: <code><pre> * difference.accept(new MyVisitor(), anOptionalArgument); * </pre></code> * <p/> * T determines the result type, A determines the type of the optional argument */ public interface DifferenceVisitor<T, A> { /** * Visits a simple difference. * * @param difference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(Difference difference, A argument); /** * Visits an object difference. * * @param objectDifference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(ObjectDifference objectDifference, A argument); /** * Visits a class difference. * * @param classDifference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(ClassDifference classDifference, A argument); /** * Visits a map difference. * * @param mapDifference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(MapDifference mapDifference, A argument); /** * Visits a collection difference. * * @param collectionDifference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(CollectionDifference collectionDifference, A argument); /** * Visits an unordered collection difference. * * @param unorderedCollectionDifference * The difference * @param argument * An optional argument, null if NA * @return The result */ T visit(UnorderedCollectionDifference unorderedCollectionDifference, A argument); }