/** * @inheritdoc */ protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Design pattern detector by Jean-François Lépine <https://twitter.com/Halleck45>'); $output->writeln(''); $finder = new Finder($input->getOption('extensions'), $input->getOption('excluded-dirs')); $files = $finder->find($input->getArgument('path')); if (0 == sizeof($files, COUNT_NORMAL)) { throw new \LogicException('No file found'); } // // 1. Extracting classes $output->writeln('<info>Extracting classes</info>'); $progress = new ProgressBar($output); $progress->start(sizeof($files, COUNT_NORMAL)); $collection = array(); $tokenizer = new Tokenizer(new CacheMemory()); $extractor = new Extractor($tokenizer); $nbClasses = 0; foreach ($files as $k => $filename) { $progress->advance(); $collection[] = $classes = $extractor->extract($filename); $nbClasses += sizeof($classes->getClasses()); } $progress->clear(); $progress->finish(); // inform user $output->writeln(''); $output->writeln(''); $output->writeln(sprintf("<info>Found %d classes</info>", $nbClasses)); // // 2. Extracting patterns $output->writeln('<info>Extracting design patterns</info>'); $patterns = array(); foreach ($collection as $oop) { $classes = $oop->getClasses(); $resolver = new PatternResolver($classes); foreach ($classes as $class) { $resolvedClass = new ResolvedClass($class); $resolver->resolve($resolvedClass); if ($resolvedClass->getPatterns()) { $patterns = array_merge($patterns, $resolvedClass->getPatterns()); } } } // inform user $output->writeln(sprintf("<info>Found %d design patterns</info>", sizeof($patterns))); foreach ($patterns as $pattern) { $output->writeln(sprintf("\t<info>[%s]</info> %s", $pattern->getName(), $pattern->describe())); } }