public function solve($ex, $params = [], &$try = 0)
{
$classBaseEx = get_class($ex);
$classes = array_merge([$classBaseEx], class_parents($ex));
$indexMin = -1;
$chosen = null;
foreach ($classes as $class) {
$indexCurrent = array_search($class, array_keys($this->rules), true);
if ($indexCurrent !== false && ($indexMin === -1 || $indexCurrent < $indexMin)) {
$indexMin = $indexCurrent;
$chosen = $class;
}
}
if ($chosen === null) {
return Promise::doReject(new ExecutionException("SolverInterface for [{$classBaseEx}] is not registered."));
}
$try++;
$params = array_merge($this->params, $params);
$valueOrPromise = $this->getSolver($chosen)->solve($ex, $params);
return Promise::doResolve($valueOrPromise);
}