You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.0 KiB
121 lines
3.0 KiB
<?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); |
|
} |
|
}
|
|
|