public function invoke($name, array &$args = array(), $callback = null, InvokeSettings $settings = null)
{
if ($callback instanceof InvokeSettings) {
$settings = $callback;
$callback = null;
}
if ($settings === null) {
$settings = new InvokeSettings();
}
$context = $this->getContext($settings);
$invokeHandler = $this->invokeHandler;
if (is_callable($callback)) {
if (is_array($callback)) {
$f = new ReflectionMethod($callback[0], $callback[1]);
} else {
$f = new ReflectionFunction($callback);
}
$n = $f->getNumberOfParameters();
$onError = $this->onError;
return Future\all($args)->then(function ($args) use($invokeHandler, $name, $context, $n, $callback, $onError) {
$result = Future\toFuture($invokeHandler($name, $args, $context));
$result->then(function ($result) use($n, $callback, $args) {
switch ($n) {
case 0:
call_user_func($callback);
break;
case 1:
call_user_func($callback, $result);
break;
case 2:
call_user_func($callback, $result, $args);
break;
case 3:
call_user_func($callback, $result, $args, null);
break;
}
}, function ($error) use($n, $callback, $args, $name, $onError) {
switch ($n) {
case 0:
call_user_func($callback);
if (is_callable($onError)) {
call_user_func($onError, $name, $error);
}
break;
case 1:
call_user_func($callback, $error);
break;
case 2:
call_user_func($callback, $error, $args);
break;
case 3:
call_user_func($callback, null, $args, $error);
break;
}
});
return $result;
});
} else {
if ($this->async) {
$args = Future\all($args);
return $args->then(function ($args) use($invokeHandler, $name, $context) {
return $invokeHandler($name, $args, $context);
});
}
return $invokeHandler($name, $args, $context);
}
}