122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  Copyright (c) 2009 hamcrest.org
 | |
|  */
 | |
| 
 | |
| abstract class FactoryFile
 | |
| {
 | |
|     /**
 | |
|      * Hamcrest standard is two spaces for each level of indentation.
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     const INDENT = '    ';
 | |
| 
 | |
|     private $indent;
 | |
| 
 | |
|     private $file;
 | |
| 
 | |
|     private $code;
 | |
| 
 | |
|     public function __construct($file, $indent)
 | |
|     {
 | |
|         $this->file = $file;
 | |
|         $this->indent = $indent;
 | |
|     }
 | |
| 
 | |
|     abstract public function addCall(FactoryCall $call);
 | |
| 
 | |
|     abstract public function build();
 | |
| 
 | |
|     public function addFileHeader()
 | |
|     {
 | |
|         $this->code = '';
 | |
|         $this->addPart('file_header');
 | |
|     }
 | |
| 
 | |
|     public function addPart($name)
 | |
|     {
 | |
|         $this->addCode($this->readPart($name));
 | |
|     }
 | |
| 
 | |
|     public function addCode($code)
 | |
|     {
 | |
|         $this->code .= $code;
 | |
|     }
 | |
| 
 | |
|     public function readPart($name)
 | |
|     {
 | |
|         return file_get_contents(__DIR__ . "/parts/$name.txt");
 | |
|     }
 | |
| 
 | |
|     public function generateFactoryCall(FactoryCall $call)
 | |
|     {
 | |
|         $method = $call->getMethod();
 | |
|         $code = $method->getComment($this->indent) . "\n";
 | |
|         $code .= $this->generateDeclaration($call->getName(), $method);
 | |
|         $code .= $this->generateCall($method);
 | |
|         $code .= $this->generateClosing();
 | |
|         return $code;
 | |
|     }
 | |
| 
 | |
|     public function generateDeclaration($name, FactoryMethod $method)
 | |
|     {
 | |
|         $code = $this->indent . $this->getDeclarationModifiers()
 | |
|             . 'function ' . $name . '('
 | |
|             . $this->generateDeclarationArguments($method)
 | |
|             . ')' . "\n" . $this->indent . '{' . "\n";
 | |
|         return $code;
 | |
|     }
 | |
| 
 | |
|     public function getDeclarationModifiers()
 | |
|     {
 | |
|         return '';
 | |
|     }
 | |
| 
 | |
|     public function generateDeclarationArguments(FactoryMethod $method)
 | |
|     {
 | |
|         if ($method->acceptsVariableArguments()) {
 | |
|             return '/* args... */';
 | |
|         } else {
 | |
|             return $method->getParameterDeclarations();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function generateImport(FactoryMethod $method)
 | |
|     {
 | |
|         return $this->indent . self::INDENT . "require_once '" . $method->getClass()->getFile() . "';" . "\n";
 | |
|     }
 | |
| 
 | |
|     public function generateCall(FactoryMethod $method)
 | |
|     {
 | |
|         $code = '';
 | |
|         if ($method->acceptsVariableArguments()) {
 | |
|             $code .= $this->indent . self::INDENT . '$args = func_get_args();' . "\n";
 | |
|         }
 | |
| 
 | |
|         $code .= $this->indent . self::INDENT . 'return ';
 | |
|         if ($method->acceptsVariableArguments()) {
 | |
|             $code .= 'call_user_func_array(array(\''
 | |
|                 . '\\' . $method->getClassName() . '\', \''
 | |
|                 . $method->getName() . '\'), $args);' . "\n";
 | |
|         } else {
 | |
|             $code .= '\\' . $method->getClassName() . '::'
 | |
|                 . $method->getName() . '('
 | |
|                 . $method->getParameterInvocations() . ');' . "\n";
 | |
|         }
 | |
| 
 | |
|         return $code;
 | |
|     }
 | |
| 
 | |
|     public function generateClosing()
 | |
|     {
 | |
|         return $this->indent . '}' . "\n";
 | |
|     }
 | |
| 
 | |
|     public function write()
 | |
|     {
 | |
|         file_put_contents($this->file, $this->code);
 | |
|     }
 | |
| }
 | 
