/**
  * @param IRoute $route
  * @param IContainer $container
  *
  * @return mixed
  */
 public function invoke(IRoute $route, IContainer $container)
 {
     list($controller, $method) = $this->extractControllerAndMethod($route->getAction());
     $this->ensureClassExists($controller);
     $instance = $container->get($controller);
     $this->ensureMethodExists($instance, $method);
     return $container->callMethod($instance, $method, $route->getParameters());
 }
 /**
  * @param $subscriber
  * @param IEvent $event
  */
 protected function invokeSubscriber($subscriber, IEvent $event)
 {
     $this->container->callMethod($subscriber, 'handle', ['event' => $event]);
 }
 /**
  * @param object $provider
  * @param IDictionary $shared
  */
 public function shutdown($provider, IDictionary $shared)
 {
     $this->container->callMethod($provider, 'shutdown', ['shared' => $shared]);
 }
 /**
  * @param object $handler
  * @param IInput $input
  * @param IOutput $output
  * @param IConsole $console
  *
  * @return mixed
  */
 public function run($handler, IInput $input, IOutput $output, IConsole $console)
 {
     return $this->container->callMethod($handler, 'run', ['input' => $input, 'in' => $input, 'output' => $output, 'out' => $output, 'console' => $console]);
 }
 /**
  * @param $handler
  * @param $command
  *
  * @return mixed
  */
 protected function invokeHandler($handler, $command)
 {
     return $this->container->callMethod($handler, 'handle', ['command' => $command, 'task' => $command]);
 }