// ========================================================================
// Copyright (C) zeroth Project Team. All rights reserved.
// GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
// http://www.gnu.org/licenses/agpl-3.0.txt
// ========================================================================
package zeroth.framework.standard.domain;
/**
* 仕様オブジェクトI/F
* <p>
* 論理演算をするための値オブジェクトである。ビジネスルールを「述語」的に表現するときに使用する。
* </p>
* @param <T> チェック対象オブジェクト型
* @author nilcy
*/
public interface Specification<T> {
/**
* 仕様チェック
* @param object チェック対象オブジェクト
* @return {@code aObject} が仕様を満たすとき {@code true}
*/
boolean isSatisfiedBy(T object);
/**
* 論理積(AND)仕様の作成
* @param spec 仕様オブジェクト
* @return 論理積(AND)仕様
*/
Specification<T> and(Specification<T> spec);
/**
* 論理和(OR)仕様の作成
* @param spec 仕様オブジェクト
* @return 論理和(OR)仕様
*/
Specification<T> or(Specification<T> spec);
/**
* 否定(NOT)仕様の作成
* @param spec 仕様オブジェクト
* @return 否定(NOT)仕様
*/
Specification<T> not(Specification<T> spec);
/**
* 排他的論理和(XOR)仕様の作成
* @param spec 仕様オブジェクト
* @return 排他的論理和(XOR)仕様
*/
Specification<T> xor(Specification<T> spec);
/**
* 否定論理積(NAND)仕様の作成
* @param spec 仕様オブジェクト
* @return 否定論理積(NAND)仕様
*/
Specification<T> nand(Specification<T> spec);
/**
* 否定論理和(NOR)仕様の作成
* @param spec 仕様オブジェクト
* @return 否定論理和(NOR)仕様
*/
Specification<T> nor(Specification<T> spec);
}