* @license MIT */ class CallInitializer extends MethodGenerator { /** * Constructor */ public function __construct( PropertyGenerator $initializerProperty, PropertyGenerator $publicPropsDefaults, PropertyGenerator $initTracker ) { parent::__construct(UniqueIdentifierGenerator::getIdentifier('callInitializer')); $this->setDocblock("Triggers initialization logic for this ghost object"); $this->setParameters(array( new ParameterGenerator('methodName'), new ParameterGenerator('parameters', 'array'), )); $this->setVisibility(static::VISIBILITY_PRIVATE); $initializer = $initializerProperty->getName(); $initialization = $initTracker->getName(); $this->setBody( 'if ($this->' . $initialization . ' || ! $this->' . $initializer . ') {' . "\n return;\n}\n\n" . "\$this->" . $initialization . " = true;\n\n" . "foreach (self::\$" . $publicPropsDefaults->getName() . " as \$key => \$default) {\n" . " \$this->\$key = \$default;\n" . "}\n\n" . '$this->' . $initializer . '->__invoke' . '($this, $methodName, $parameters, $this->' . $initializer . ');' . "\n\n" . "\$this->" . $initialization . " = false;" ); } }