3 namespace DrupalCodeGenerator;
5 use RecursiveDirectoryIterator;
6 use RecursiveIteratorIterator;
8 use Symfony\Component\Filesystem\Filesystem;
11 * Discovery of generator commands.
13 class GeneratorDiscovery {
15 const COMMAND_INTERFACE = '\DrupalCodeGenerator\Command\GeneratorInterface';
18 * The file system utility.
20 * @var \Symfony\Component\Filesystem\Filesystem
22 protected $filesystem;
25 * Constructs discovery object.
27 * @param \Symfony\Component\Filesystem\Filesystem $filesystem
28 * The file system utility.
30 public function __construct(Filesystem $filesystem) {
31 $this->filesystem = $filesystem;
35 * Finds and instantiates generator commands.
37 * @param array $command_directories
38 * Directories to look up for commands.
39 * @param string $namespace
40 * (Optional) The namespace to filter out commands.
42 * @return \Symfony\Component\Console\Command\Command[]
43 * Array of generators.
45 public function getGenerators(array $command_directories, $namespace = '\DrupalCodeGenerator\Command') {
48 foreach ($command_directories as $directory) {
49 $iterator = new RecursiveIteratorIterator(
50 new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS)
52 foreach ($iterator as $path => $file) {
53 if ($file->getExtension() == 'php') {
54 $relative_path = $this->filesystem->makePathRelative($path, $directory);
55 $class = $namespace . '\\' . str_replace('/', '\\', preg_replace('#\.php/$#', '', $relative_path));
56 if (class_exists($class)) {
57 $reflected_class = new ReflectionClass($class);
58 if (!$reflected_class->isInterface() && !$reflected_class->isAbstract() && $reflected_class->implementsInterface(self::COMMAND_INTERFACE)) {
59 $commands[] = new $class();