public function evaluate(Predicate $predicate, string $description = null): bool
    {
        try {
            if ($predicate->test($this->value)) {
                return true;
            }
        } catch (\Exception $e) {
            if (empty($description)) {
                $description = $e->getMessage();
            } else {
                $description .= "\n" . $e->getMessage();
            }
        }

        throw new AssertionFailure(
                $this->describeFailure($predicate, $description)
        );
    }