public function evaluate(array $item, array $clause)
    {
        if (false === isset($clause['key']) ||
            false === isset($clause['value']) ||
            false === isset($clause['operator'])
        ) {
            throw new \InvalidArgumentException('Clause must contain "key", "value" and operator.');
        }

        $value = isset($item[$clause['key']]) ? $item[$clause['key']] : null;
        $value = $this->evaluateFilters($value, $clause);

        if (false === isset($this->operators[$clause['operator']])) {
            throw new UnkownOperatorException(sprintf('The operator "%s" does not exist.', $clause['operator']));
        }

        if (false === $this->operators[$clause['operator']]->evaluate($value, $clause['value'])) {
            return false;
        }

        return true;
    }