/** * 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)); }