123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?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) . PHP_EOL;
- $code .= $this->generateDeclaration($call->getName(), $method);
- // $code .= $this->generateImport($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)
- . ')' . PHP_EOL . $this->indent . '{' . PHP_EOL;
- 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() . "';" . PHP_EOL;
- }
-
- public function generateCall(FactoryMethod $method)
- {
- $code = '';
- if ($method->acceptsVariableArguments()) {
- $code .= $this->indent . self::INDENT . '$args = func_get_args();' . PHP_EOL;
- }
-
- $code .= $this->indent . self::INDENT . 'return ';
- if ($method->acceptsVariableArguments()) {
- $code .= 'call_user_func_array(array(\''
- . '\\' . $method->getClassName() . '\', \''
- . $method->getName() . '\'), $args);' . PHP_EOL;
- } else {
- $code .= '\\' . $method->getClassName() . '::'
- . $method->getName() . '('
- . $method->getParameterInvocations() . ');' . PHP_EOL;
- }
-
- return $code;
- }
-
- public function generateClosing()
- {
- return $this->indent . '}' . PHP_EOL;
- }
-
- public function write()
- {
- file_put_contents($this->file, $this->code);
- }
- }
|