| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
							- <?php
 
- /*
 
-  Copyright (c) 2009 hamcrest.org
 
-  */
 
- /**
 
-  * Controls the process of extracting @factory doctags
 
-  * and generating factory method files.
 
-  *
 
-  * Uses File_Iterator to scan for PHP files.
 
-  */
 
- class FactoryGenerator
 
- {
 
-     /**
 
-      * Path to the Hamcrest PHP files to process.
 
-      *
 
-      * @var string
 
-      */
 
-     private $path;
 
-     /**
 
-      * @var array of FactoryFile
 
-      */
 
-     private $factoryFiles;
 
-     public function __construct($path)
 
-     {
 
-         $this->path = $path;
 
-         $this->factoryFiles = array();
 
-     }
 
-     public function addFactoryFile(FactoryFile $factoryFile)
 
-     {
 
-         $this->factoryFiles[] = $factoryFile;
 
-     }
 
-     public function generate()
 
-     {
 
-         $classes = $this->getClassesWithFactoryMethods();
 
-         foreach ($classes as $class) {
 
-             foreach ($class->getMethods() as $method) {
 
-                 foreach ($method->getCalls() as $call) {
 
-                     foreach ($this->factoryFiles as $file) {
 
-                         $file->addCall($call);
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     public function write()
 
-     {
 
-         foreach ($this->factoryFiles as $file) {
 
-             $file->build();
 
-             $file->write();
 
-         }
 
-     }
 
-     public function getClassesWithFactoryMethods()
 
-     {
 
-         $classes = array();
 
-         $files = $this->getSortedFiles();
 
-         foreach ($files as $file) {
 
-             $class = $this->getFactoryClass($file);
 
-             if ($class !== null) {
 
-                 $classes[] = $class;
 
-             }
 
-         }
 
-         return $classes;
 
-     }
 
-     public function getSortedFiles()
 
-     {
 
-         $iter = $this->getFileIterator();
 
-         $files = array();
 
-         foreach ($iter as $file) {
 
-             $files[] = $file;
 
-         }
 
-         sort($files, SORT_STRING);
 
-         return $files;
 
-     }
 
-     private function getFileIterator()
 
-     {
 
-         $factoryClass = class_exists('File_Iterator_Factory') ? 'File_Iterator_Factory' : 'SebastianBergmann\FileIterator\Factory';
 
-         $factory = new $factoryClass();
 
-         return $factory->getFileIterator($this->path, '.php');
 
-     }
 
-     public function getFactoryClass($file)
 
-     {
 
-         $name = $this->getFactoryClassName($file);
 
-         if ($name !== null) {
 
-             require_once $file;
 
-             if (class_exists($name)) {
 
-                 $class = new FactoryClass(substr($file, strpos($file, 'Hamcrest/')), new ReflectionClass($name));
 
-                 if ($class->isFactory()) {
 
-                     return $class;
 
-                 }
 
-             }
 
-         }
 
-         return null;
 
-     }
 
-     public function getFactoryClassName($file)
 
-     {
 
-         $content = file_get_contents($file);
 
-         if (preg_match('/namespace\s+(.+);/', $content, $namespace)
 
-             && preg_match('/\n\s*class\s+(\w+)\s+extends\b/', $content, $className)
 
-             && preg_match('/@factory\b/', $content)
 
-         ) {
 
-             return $namespace[1] . '\\' . $className[1];
 
-         }
 
-         return null;
 
-     }
 
- }
 
 
  |