Example #1
0
 /**
  * Iterates over given namespaces and tries to locate class.
  *
  * @param array $task Task
  *
  * @return AbstractTask
  * @throws \LogicException When task class doesn't implement task interface
  */
 private function locateAndCreateTask(array $task)
 {
     $className = $task['task'];
     unset($task['task']);
     Assertion::string($className);
     Assertion::notEmpty($className);
     $this->logger->debug(sprintf("Trying to locate task '%s'", $className));
     foreach ($this->namespaces as $namespace) {
         $this->logger->debug(sprintf("Searching in namespace '%s' for class/task '%s'", $namespace, $className));
         $class = $namespace . '\\' . $className;
         if (class_exists($class)) {
             $reflectionClass = new ReflectionClass($class);
             if (!$reflectionClass->isExtendingOrImplementing(self::LOCAL_TASK) && !$reflectionClass->isExtendingOrImplementing(self::REMOTE_TASK)) {
                 throw new \LogicException(sprintf("Task class '%s' either must extend '%s' or '%s'", $class, self::LOCAL_TASK, self::REMOTE_TASK));
             }
             $this->logger->debug(sprintf("Found class in namespace '%s'. Creating instance.", $namespace));
             $name = $task['name'];
             unset($task['name']);
             /** @var AbstractTask $task */
             $task = new $class($name, $this->interpolateOptions($task));
             $this->logger->debug('Injecting logger instance');
             $task->setLogger($this->logger);
             $this->logger->debug(sprintf("Injecting output handler '%s' instance", get_class($this->outputHandler)));
             $task->setOutput($this->outputHandler);
             $task->setInterpolator($this->interpolator);
             return $task;
         }
     }
     throw new \DomainException(sprintf("Can't locate task class '%s' in registered namespaces", $className));
 }