Exemple #1
0
 /**
  * @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;
 }
Exemple #3
0
 /**
  * @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;
 }