public function execute($command = null, array $args = array(), array $options = array())
{
$command = $command ?: $this->defaultCommand;
if (!isset($this->commands[$command])) {
throw new ConsoleException("Command '{$command}' does not exist");
}
$callback = $this->commands[$command];
if (is_callable($callback)) {
$params = array($args, $options);
if (is_string($callback)) {
if (strpos($callback, '::') !== false) {
list($classname, $methodname) = explode('::', $callback);
$reflection = new ReflectionMethod($classname, $methodname);
} else {
$reflection = new ReflectionFunction($callback);
}
$params = Utils::computeFuncParams($reflection, $args, $options);
}
$params[] = $this;
return call_user_func_array($callback, $params);
}
$method = new ReflectionMethod($callback, 'execute');
$params = Utils::computeFuncParams($method, $args, $options);
return $method->invokeArgs(new $callback($this), $params);
}