public function testGetCode()
 {
     $definitionBuilder = new DefinitionBuilder(new ParameterBuilder());
     $definitionBuilder->defineParameter('key', new StringReference('value'))->defineParameter('key1', new BoolReference(true))->defineParameter('slow_driver', new ClassReference(SlowDriver::class))->end()->addDefinition(Car::class)->defineIsSingleton()->defineConstructor()->defineParameter('driver')->defineDependency(new ParameterReference('slow_driver'))->end()->end()->defineProperty('driver')->defineDependency(new ClassReference(SlowDriver::class))->end()->end()->addDefinition(WheelController::class)->defineConstructor()->defineParameter('fastDriver')->defineDependency(new ClassReference(SlowDriver::class))->end()->defineParameter('slowDriver')->defineDependency(new ClassReference(SlowDriver::class))->end()->defineParameter('car')->defineDependency(new ClassReference(Car::class))->end()->defineParameter('params')->defineDependency((new CollectionReference([new CollectionItem(new ConstantReference('PHP_VERSION'), new IntegerReference(1)), 'sdf' => 33, 'sdf1' => new ConstantReference('PHP_MAJOR_VERSION'), 'sdf2' => new StringReference('value'), 3333 => 5555]))->addItem(CollectionItem::create(3333, new ConstantReference('PHP_MINOR_VERSION')))->addItem(CollectionItem::create(22, 'sdf'))->addItem(CollectionItem::create('sdf', 'dsddd')))->end()->defineParameter('id')->defineDependency(new ConstantReference('PHP_RELEASE_VERSION'))->end()->end()->defineMethod('setLeg')->defineParameter('leg')->defineDependency(new ClassReference(Leg::class))->end()->end()->defineProperty('car')->defineDependency(new ClassReference(Car::class))->end()->end()->addDefinition(ProductClass::class)->defineConstructor()->end()->end();
     $compiler = new DefinitionCompiler(new DefinitionGenerator(new ClassGenerator()), $this->getAnalyzer());
     $namespace = (new \ReflectionClass(self::class))->getNamespaceName();
     /** @var ContainerInterface $container */
     $container = $compiler->compile($definitionBuilder, 'ContainerGeneratorTest1', $namespace, __DIR__ . '/../../generated');
     static::assertInstanceOf(WheelController::class, $container->get(WheelController::class));
 }
 /**
  * Resolve xml code
  *
  * @param DefinitionBuilder $definitionBuilder
  * @param string $xml
  *
  * @throws ClassDefinitionAlreadyExistsException
  * @throws \InvalidArgumentException
  * @throws PropertyDefinitionAlreadyExistsException
  * @throws ReferenceNotImplementsException
  * @throws MethodDefinitionAlreadyExistsException
  * @throws ParameterDefinitionAlreadyExistsException
  * @throws ParameterAlreadyExistsException
  */
 public function resolve(DefinitionBuilder $definitionBuilder, string $xml)
 {
     /**
      * Iterate config and resolve single instance
      *
      * @var string $key
      * @var array $arrayData
      */
     foreach ($this->xml2array(new \SimpleXMLElement($xml)) as $key => $arrayData) {
         // Resolve parameters
         if ($key === self::PARAMETERS_KEY) {
             // Define parameters
             foreach ($arrayData as $parameterKey => $parameterArray) {
                 $definitionBuilder->defineParameter($parameterKey, $this->resolveDependency($parameterArray));
             }
         }
         // Resolve dependencies
         if ($key === self::DEPENDENCIES_KEY) {
             // Iterate instances
             foreach ($arrayData as $dependencyKey => $definitionsArrayData) {
                 // Get only definition instances
                 if ($dependencyKey === self::INSTANCE_KEY) {
                     /**
                      * If we have only one instance we need to add array
                      * @var array $collection
                      */
                     $collection = !array_key_exists(0, $definitionsArrayData) ? [$definitionsArrayData] : $definitionsArrayData;
                     /**
                      * Iterate collection of instances
                      * @var array $definitionsArrayData
                      */
                     foreach ($collection as $definitionArrayData) {
                         /**
                          * Create class definition
                          * @var ClassDefinition $classDefinition
                          */
                         $classDefinition = $definitionBuilder->addDefinition($definitionArrayData['@attributes']['class']);
                         // Resolve constructor
                         if (array_key_exists('constructor', $definitionArrayData)) {
                             $this->resolveConstructor($classDefinition, $definitionArrayData['constructor']);
                         }
                         // Resolve methods
                         if (array_key_exists('methods', $definitionArrayData)) {
                             // Iteare methods
                             foreach ($definitionArrayData['methods'] as $methodName => $methodArray) {
                                 $this->resolveMethod($classDefinition, $methodArray, $methodName);
                             }
                         }
                         // Resolve properties
                         if (array_key_exists('properties', $definitionArrayData)) {
                             // Iterate properties
                             foreach ($definitionArrayData['properties'] as $propertyName => $propertyArray) {
                                 $this->resolveProperty($classDefinition, $propertyArray, $propertyName);
                             }
                         }
                     }
                 }
             }
         }
     }
 }