/**
  * {@inheritdoc}
  *
  * @throws UnexpectedTypeException When the constraint isn't a subclass of {@see AbstractAssertionConstraint}
  * @throws ConstraintDefinitionException When the assertion doesn't exist on the assertion class
  */
 public function validate($value, Constraint $constraint)
 {
     if (!$constraint instanceof AbstractAssertionConstraint) {
         throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\AbstractAssertionConstraint');
     }
     $methodName = $constraint->getAssertionMethodName();
     $callable = [static::$assertClass, $methodName];
     $override = null;
     if (is_callable($callable) === false) {
         throw new ConstraintDefinitionException('Must be a valid callable on the assertion class');
     }
     $parameters = array($value);
     foreach ($constraint->getAssertionParameterNames() as $name) {
         $parameters[] = $constraint->{$name};
     }
     try {
         call_user_func_array($callable, $parameters);
     } catch (\Exception $e) {
         if ($e instanceof static::$assertExceptionClass) {
             $this->context->buildViolation($e->getMessage())->setParameter('{{ value }}', $this->formatValue($value))->setCode($e->getCode())->setCause($e)->addViolation();
         } else {
             throw $e;
         }
     }
 }