package evanq.game.common.specification; /** * Specificaiton interface. * <p/> * Use {@link se.citerus.dddsample.domain.shared.AbstractSpecification} as base for creating specifications, and * only the method {@link #isSatisfiedBy(Object)} must be implemented. */ public interface Specification<T> { /** * Check if {@code t} is satisfied by the specification. * * @param t Object to test. * @return {@code true} if {@code t} satisfies the specification. */ boolean isSatisfiedBy(T t); /** * Create a new specification that is the AND operation of {@code this} specification and another specification. * @param specification Specification to AND. * @return A new specification. */ Specification<T> and(Specification<T> specification); /** * Create a new specification that is the OR operation of {@code this} specification and another specification. * @param specification Specification to OR. * @return A new specification. */ Specification<T> or(Specification<T> specification); /** * Create a new specification that is the NOT operation of {@code this} specification. * @param specification Specification to NOT. * @return A new specification. */ Specification<T> not(Specification<T> specification); }