A common implementation for the criterion object is the Specification pattern. A specification is a simple predicate that takes a Domain object and returns a boolean. Given a Domain object, it will return true if it specifies the specification, and false otherwise:
interface PostSpecification
{
/**
* @return boolean
*/
public function specifies(Post $aPost);
}
We just need to add a query method to our Repository:
interface PostRepository
{
// ...
public function query($specification);
}