/** * @return Builder\Class_ * @throws Exception\DomainException */ private function compileClass() { $definitions = $this->definitions; $class = $this->builderFactory->class($this->class)->extend('CompiledContainer'); $mapNodes = array(); foreach ($definitions as $definition) { if ($definition instanceof Definition\AliasDefinition) { $alias = Utils::resolveAlias($this->definitions, $definition, false); $mapNodes[] = new Node\Expr\ArrayItem(new Node\Scalar\String_($alias->getIdentifier()), new Node\Scalar\String_($definition->getKey())); } else { if ($definition instanceof Definition\InterfaceDefinition) { // ignore } else { if (!$definition->isFactory()) { $class->addStmt($property = $this->builderFactory->property($definition->getIdentifier())->makePrivate()->setDocComment('/** * @var ' . $definition->getTypeHint() . ' */')); } $identifier = $definition->getIdentifier(); // Add method $class->addStmt($this->compileDefinition($definition)); // Add map entry $mapNodes[] = new Node\Expr\ArrayItem(new Node\Scalar\String_($identifier), new Node\Scalar\String_($definition->getKey())); } } } $class->addStmt($this->builderFactory->property('map')->makeProtected()->makeStatic()->setDefault(new Node\Expr\Array_($mapNodes))->setDocComment('/** * @var array */')); return $class; }
/** * @inheritdoc */ public function compile() { $definition = $this->definition; $identifier = $definition->getIdentifier(); // Prepare method $method = $this->builderFactory->method($identifier)->makeProtected()->setDocComment('/** * @return ' . $definition->getTypeHint() . ' */'); // Prepare instance check $prop = null; if (!$definition->isFactory()) { $method->addStmt($this->makeSingletonCheck()); $prop = new Node\Expr\PropertyFetch(new Node\Expr\Variable('this'), $identifier); } // Prepare method body $providerDefinition = Utils::resolveAlias($this->definitions, Utils::resolveDefinition($this->definitions, $definition->getProvider())); $fetch = new Node\Expr\MethodCall(new Node\Expr\MethodCall(new Node\Expr\Variable('this'), $providerDefinition->getIdentifier()), 'get'); if (!$definition->isFactory()) { $method->addStmt(new Node\Stmt\Return_(new Node\Expr\Assign(clone $prop, $fetch))); } else { $method->addStmt(new Node\Stmt\Return_($fetch)); } return $method; }
/** * @param Definition[] $definitions * @param string $key * @param boolean $isOptional * @return null|Definition */ public static function resolveAliasKey(array $definitions, $key, $isOptional = false) { $definition = Utils::resolveDefinition($definitions, $key, $isOptional); if ($definition) { $definition = Utils::resolveAlias($definitions, $definition, $isOptional); } return $definition; }