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