Overview

Namespaces

  • Net
    • Bazzline
      • Component
        • Locator
          • Configuration
            • Assembler
            • Validator
          • FileExistsStrategy
          • Generator
          • MethodBodyBuilder
          • Process
            • Transformer
              • Assembler
              • FileLoader
              • Generator
            • Validator

Classes

  • Net\Bazzline\Component\Locator\Configuration\Assembler\AbstractAssembler
  • Net\Bazzline\Component\Locator\Configuration\Assembler\FromArrayAssembler
  • Net\Bazzline\Component\Locator\Configuration\Assembler\FromPropelSchemaXmlAssembler
  • Net\Bazzline\Component\Locator\Configuration\Configuration
  • Net\Bazzline\Component\Locator\Configuration\ConfigurationFactory
  • Net\Bazzline\Component\Locator\Configuration\Instance
  • Net\Bazzline\Component\Locator\Configuration\Uses
  • Net\Bazzline\Component\Locator\Configuration\Validator\ReadableFilePath
  • Net\Bazzline\Component\Locator\FileExistsStrategy\AbstractStrategy
  • Net\Bazzline\Component\Locator\FileExistsStrategy\DeleteStrategy
  • Net\Bazzline\Component\Locator\FileExistsStrategy\SuffixWithCurrentTimestampStrategy
  • Net\Bazzline\Component\Locator\Generator\AbstractGenerator
  • Net\Bazzline\Component\Locator\Generator\AbstractInterfaceGenerator
  • Net\Bazzline\Component\Locator\Generator\FactoryInterfaceGenerator
  • Net\Bazzline\Component\Locator\Generator\InvalidArgumentExceptionGenerator
  • Net\Bazzline\Component\Locator\Generator\LocatorGenerator
  • Net\Bazzline\Component\Locator\Generator\LocatorInterfaceGenerator
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\AbstractMethodBodyBuilder
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\FetchFromFactoryInstancePoolBuilder
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\FetchFromSharedInstancePoolBuilder
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\FetchFromSharedInstancePoolOrCreateByFactoryBuilder
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\NewInstanceBuilder
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\PropelQueryCreateBuilder
  • Net\Bazzline\Component\Locator\Process\Transformer\Assembler\ConfigurationAssembler
  • Net\Bazzline\Component\Locator\Process\Transformer\FileLoader\ConfigurationFileLoader
  • Net\Bazzline\Component\Locator\Process\Transformer\FileLoader\IfAvailableBootstrapFileLoader
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\ArgumentsGenerator
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\FactoryGenerator
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\FileExistsStrategyGenerator
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\InvalidArgumentExceptionFileGenerator
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\LocatorFileGenerator
  • Net\Bazzline\Component\Locator\Process\Transformer\Generator\LocatorInterfaceFileGenerator
  • Net\Bazzline\Component\Locator\Process\Validator\ArgumentsValidator
  • Net\Bazzline\Component\Locator\Process\Validator\ConfigurationDataValidator
  • Net\Bazzline\Component\Locator\Process\Validator\ConfigurationValidator
  • Net\Bazzline\Component\Locator\Process\Validator\IsCommandLineValidator
  • Net\Bazzline\Component\Locator\ProcessPipeFactory

Interfaces

  • Net\Bazzline\Component\Locator\Configuration\Assembler\AssemblerInterface
  • Net\Bazzline\Component\Locator\FactoryInterface
  • Net\Bazzline\Component\Locator\FileExistsStrategy\FileExistsStrategyInterface
  • Net\Bazzline\Component\Locator\Generator\GeneratorInterface
  • Net\Bazzline\Component\Locator\InstanceDependentInterface
  • Net\Bazzline\Component\Locator\LocatorInterface
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\MethodBodyBuilderInterface

Exceptions

  • Net\Bazzline\Component\Locator\Configuration\Assembler\InvalidArgumentException
  • Net\Bazzline\Component\Locator\Configuration\Assembler\RuntimeException
  • Net\Bazzline\Component\Locator\Configuration\Validator\RuntimeException
  • Net\Bazzline\Component\Locator\Exception
  • Net\Bazzline\Component\Locator\FileExistsStrategy\InvalidArgumentException
  • Net\Bazzline\Component\Locator\FileExistsStrategy\RuntimeException
  • Net\Bazzline\Component\Locator\InvalidArgumentException
  • Net\Bazzline\Component\Locator\MethodBodyBuilder\RuntimeException
  • Net\Bazzline\Component\Locator\RuntimeException
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 
<?php
/**
 * @author stev leibelt <artodeto@bazzline.net>
 * @since 2014-06-17 
 */

namespace Net\Bazzline\Component\Locator\Generator;

use Net\Bazzline\Component\CodeGenerator\ClassGenerator;
use Net\Bazzline\Component\CodeGenerator\FileGenerator;
use Net\Bazzline\Component\CodeGenerator\Factory\BlockGeneratorFactory;
use Net\Bazzline\Component\CodeGenerator\Factory\ClassGeneratorFactory;
use Net\Bazzline\Component\CodeGenerator\Factory\DocumentationGeneratorFactory;
use Net\Bazzline\Component\CodeGenerator\Factory\FileGeneratorFactory;
use Net\Bazzline\Component\CodeGenerator\Factory\MethodGeneratorFactory;
use Net\Bazzline\Component\CodeGenerator\Factory\PropertyGeneratorFactory;
use Net\Bazzline\Component\Locator\Configuration\Configuration;
use Net\Bazzline\Component\Locator\Configuration\Instance;
use Net\Bazzline\Component\Locator\Generator\AbstractGenerator;
use Net\Bazzline\Component\Locator\RuntimeException;

/**
 * Class LocatorFileGenerator
 * @package Net\Bazzline\Component\Locator
 * @todo split up into sub processes
 */
class LocatorGenerator extends AbstractGenerator
{
    /** @var BlockGeneratorFactory */
    protected $blockGeneratorFactory;

    /** @var ClassGeneratorFactory */
    private $classGeneratorFactory;

    /** @var DocumentationGeneratorFactory */
    private $documentationGeneratorFactory;

    /** @var FileGeneratorFactory */
    private $fileGeneratorFactory;

    /** @var MethodGeneratorFactory */
    protected $methodGeneratorFactory;

    /** @var PropertyGeneratorFactory */
    protected $propertyGeneratorFactory;

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\BlockGeneratorFactory $factory
     * @return $this
     */
    public function setBlockGeneratorFactory(BlockGeneratorFactory $factory)
    {
        $this->blockGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\ClassGeneratorFactory $factory
     * @return $this
     */
    public function setClassGeneratorFactory(ClassGeneratorFactory $factory)
    {
        $this->classGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\DocumentationGeneratorFactory $factory
     * @return $this
     */
    public function setDocumentationGeneratorFactory(DocumentationGeneratorFactory $factory)
    {
        $this->documentationGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\FileGeneratorFactory $factory
     * @return $this
     */
    public function setFileGeneratorFactory(FileGeneratorFactory $factory)
    {
        $this->fileGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\MethodGeneratorFactory $factory
     * @return $this
     */
    public function setMethodGeneratorFactory(MethodGeneratorFactory $factory)
    {
        $this->methodGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @param \Net\Bazzline\Component\CodeGenerator\Factory\PropertyGeneratorFactory $factory
     * @return $this
     */
    public function setPropertyGeneratorFactory(PropertyGeneratorFactory $factory)
    {
        $this->propertyGeneratorFactory = $factory;

        return $this;
    }

    /**
     * @throws RuntimeException
     */
    public function generate()
    {
        $this->moveOldFileIfExists(
            $this->configuration->getFilePath(),
            $this->configuration->getFileName()
        );

        $fileGenerator = $this->createFile(
            $this->fileGeneratorFactory->create()
        );
        $classGenerator = $this->createClass(
            $this->classGeneratorFactory->create(),
            $this->configuration,
            $this->documentationGeneratorFactory
        );

        if ($this->configuration->hasInstances()) {
            $classGenerator = $this->addInstanceFetching(
                $this->blockGeneratorFactory,
                $classGenerator,
                $this->configuration,
                $this->documentationGeneratorFactory,
                $this->methodGeneratorFactory
            );

            if ($this->configuration->hasFactoryInstances()) {
                $classGenerator = $this->addImplementsLocatorInterface(
                    $classGenerator
                );
                $classGenerator = $this->addFactoryInstancePooling(
                    $this->blockGeneratorFactory,
                    $classGenerator,
                    $this->documentationGeneratorFactory,
                    $this->methodGeneratorFactory,
                    $this->propertyGeneratorFactory
                );
            }

            if ($this->configuration->hasSharedInstances()) {
                $classGenerator = $this->addSharedInstancePooling(
                    $this->blockGeneratorFactory,
                    $classGenerator,
                    $this->documentationGeneratorFactory,
                    $this->methodGeneratorFactory,
                    $this->propertyGeneratorFactory
                );
            }
        }

        $fileGenerator->addClass($classGenerator);
        $fileContent = $fileGenerator->generate();

        $fullQualifiedPathName = $this->configuration->getFilePath() .
            DIRECTORY_SEPARATOR . $this->configuration->getFileName();
        $this->dumpToFile($fullQualifiedPathName, $fileContent);
    }

    /**
     * @param FileGenerator $fileGenerator
     * @return FileGenerator
     */
    private function createFile(FileGenerator $fileGenerator)
    {
        $fileGenerator->addFileContent(
            array(
                '/**',
                ' * @author Net\Bazzline\Component\Locator',
                ' * @since ' . date('Y-m-d'),
                ' */'
            )
        );

        return $fileGenerator;
    }

    /**
     * @param ClassGenerator $classGenerator
     * @param Configuration $configuration
     * @param DocumentationGeneratorFactory $documentationGeneratorFactory
     * @return ClassGenerator
     */
    private function createClass(
        ClassGenerator $classGenerator,
        Configuration $configuration,
        DocumentationGeneratorFactory $documentationGeneratorFactory
    )
    {
        $documentationGenerator = $documentationGeneratorFactory->create();
        $documentationGenerator->setClass($configuration->getClassName());

        if ($configuration->hasNamespace()) {
            $documentationGenerator->setPackage($configuration->getNamespace());
        }

        $classGenerator->setDocumentation($documentationGenerator);
        $classGenerator->setName($configuration->getClassName());

        if ($configuration->hasNamespace()) {
            $classGenerator->setNamespace($configuration->getNamespace());
        }

        if ($configuration->hasExtends()) {
            $classGenerator->setExtends($configuration->getExtends());
        }

        if ($configuration->hasUses()) {
            foreach ($configuration->getUseCollection() as $use) {
                $classGenerator->addUse($use->getClassName(), $use->getAlias());
            }
        }

        if ($configuration->hasImplements()) {
            foreach ($configuration->getImplements() as $interfaceName) {
                $classGenerator->addImplements($interfaceName);
            }
        }

        return $classGenerator;
    }

    /**
     * @param BlockGeneratorFactory $blockGeneratorFactory
     * @param ClassGenerator $classGenerator
     * @param DocumentationGeneratorFactory $documentationGeneratorFactory
     * @param MethodGeneratorFactory $methodGeneratorFactory
     * @param PropertyGeneratorFactory $propertyGeneratorFactory
     * @return ClassGenerator
     */
    private function addFactoryInstancePooling(
        BlockGeneratorFactory $blockGeneratorFactory,
        ClassGenerator $classGenerator,
        DocumentationGeneratorFactory $documentationGeneratorFactory,
        MethodGeneratorFactory $methodGeneratorFactory,
        PropertyGeneratorFactory $propertyGeneratorFactory
    )
    {
        //begin of property
        $factoryInstancePool = $propertyGeneratorFactory->create();

        $factoryInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $factoryInstancePool->setName('factoryInstancePool');
        $factoryInstancePool->markAsPrivate();
        $factoryInstancePool->setValue('array()');
        //end of property

        //begin of methods
        //begin of fetch from factory instance pool
        $fetchFromFactoryInstancePoolBody   = $blockGeneratorFactory->create();
        $fetchFromFactoryInstancePool       = $methodGeneratorFactory->create();

        $fetchFromFactoryInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $fetchFromFactoryInstancePool->setName('fetchFromFactoryInstancePool');
        $fetchFromFactoryInstancePool->addParameter('className', null, 'string');
        $fetchFromFactoryInstancePool->markAsProtected();
        $fetchFromFactoryInstancePool->markAsFinal();

        $fetchFromFactoryInstancePoolBody
            ->add('if ($this->isNotInFactoryInstancePool($className)) {')
            ->startIndention()
                ->add('if (!class_exists($className)) {')
                ->startIndention()
                    ->add('throw new InvalidArgumentException(')
                    ->startIndention()
                        ->add('\'factory class "\' . $className . \'" does not exist\'')
                    ->stopIndention()
                    ->add(');')
                ->stopIndention()
                ->add('}')
                ->add('')
                ->add('/** @var FactoryInterface $factory */')
                ->add('$factory = new $className();')
                ->add('$factory->setLocator($this);')
                ->add('$this->addToFactoryInstancePool($className, $factory);')
            ->stopIndention()
            ->add('}')
            ->add('')
            ->add('return $this->getFromFactoryInstancePool($className);');

        $fetchFromFactoryInstancePool->setBody($fetchFromFactoryInstancePoolBody, array('FactoryInterface'));
        $fetchFromFactoryInstancePool->getDocumentation()->addThrows('InvalidArgumentException');
        //end of fetch from factory instance pool

        //begin of fetch from factory instance pool
        $addToFactoryInstancePoolBody   = $blockGeneratorFactory->create();
        $addToFactoryInstancePool       = $methodGeneratorFactory->create();

        $addToFactoryInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $addToFactoryInstancePool->setName('addToFactoryInstancePool');
        $addToFactoryInstancePool->addParameter('className', null, 'string');
        $addToFactoryInstancePool->addParameter('factory', null, 'FactoryInterface');
        $addToFactoryInstancePool->markAsPrivate();

        $addToFactoryInstancePoolBody
            ->add('$this->factoryInstancePool[$className] = $factory;')
            ->add('')
            ->add('return $this;');

        $addToFactoryInstancePool->setBody($addToFactoryInstancePoolBody, array('$this'));
        //end of fetch from factory instance pool

        //begin of get from factory instance pool
        $getFromFactoryInstancePoolBody = $blockGeneratorFactory->create();
        $getFromFactoryInstancePool     = $methodGeneratorFactory->create();

        $getFromFactoryInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $getFromFactoryInstancePool->setName('getFromFactoryInstancePool');
        $getFromFactoryInstancePool->addParameter('className', null, 'string');
        $getFromFactoryInstancePool->markAsPrivate();

        $getFromFactoryInstancePoolBody
            ->add('return $this->factoryInstancePool[$className];');

        $getFromFactoryInstancePool->setBody($getFromFactoryInstancePoolBody, array('null', 'FactoryInterface'));
        //end of get from factory instance pool

        //begin of is not in factory instance pool
        $isNotInFactoryInstancePoolBody = $blockGeneratorFactory->create();
        $isNotInFactoryInstancePool = $methodGeneratorFactory->create();

        $isNotInFactoryInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $isNotInFactoryInstancePool->setName('isNotInFactoryInstancePool');
        $isNotInFactoryInstancePool->addParameter('className', null, 'string');
        $isNotInFactoryInstancePool->markAsPrivate();

        $isNotInFactoryInstancePoolBody
            ->add('return (!isset($this->factoryInstancePool[$className]));');

        $isNotInFactoryInstancePool->setBody($isNotInFactoryInstancePoolBody, array('boolean'));
        //end of is not in factory instance pool
        //begin of methods

        //begin of adding to class
        $classGenerator->addProperty($factoryInstancePool);

        //protected
        $classGenerator->addMethod($fetchFromFactoryInstancePool);
        //private
        $classGenerator->addMethod($addToFactoryInstancePool);
        $classGenerator->addMethod($getFromFactoryInstancePool);
        $classGenerator->addMethod($isNotInFactoryInstancePool);
        //end of adding to class

        return $classGenerator;
    }

    /**
     * @param BlockGeneratorFactory $blockGeneratorFactory
     * @param ClassGenerator $classGenerator
     * @param DocumentationGeneratorFactory $documentationGeneratorFactory
     * @param MethodGeneratorFactory $methodGeneratorFactory
     * @param PropertyGeneratorFactory $propertyGeneratorFactory
     * @return ClassGenerator
     */
    private function addSharedInstancePooling(
        BlockGeneratorFactory $blockGeneratorFactory,
        ClassGenerator $classGenerator,
        DocumentationGeneratorFactory $documentationGeneratorFactory,
        MethodGeneratorFactory $methodGeneratorFactory,
        PropertyGeneratorFactory $propertyGeneratorFactory
    )
    {
        //begin of property
        $sharedInstancePool = $propertyGeneratorFactory->create();

        $sharedInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $sharedInstancePool->setName('sharedInstancePool');
        $sharedInstancePool->markAsPrivate();
        $sharedInstancePool->setValue('array()');
        //end of property

        //begin of methods
        //begin of fetch from shared instance pool
        //end of fetch from shared instance pool
        $fetchFromSharedInstancePoolBody    = $blockGeneratorFactory->create();
        $fetchFromSharedInstancePool        = $methodGeneratorFactory->create();

        $fetchFromSharedInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $fetchFromSharedInstancePool->setName('fetchFromSharedInstancePool');
        $fetchFromSharedInstancePool->addParameter('className', null, 'string');
        $fetchFromSharedInstancePool->markAsProtected();
        $fetchFromSharedInstancePool->markAsFinal();

        $fetchFromSharedInstancePoolBody
            ->add('if ($this->isNotInSharedInstancePool($className)) {')
            ->startIndention()
                ->add('if (!class_exists($className)) {')
                ->startIndention()
                    ->add('throw new InvalidArgumentException(')
                    ->startIndention()
                        ->add('\'class "\' . $className . \'" does not exist\'')
                    ->stopIndention()
                    ->add(');')
                ->stopIndention()
                ->add('}')
                ->add('')
                ->add('$instance = new $className();')
                ->add('$this->addToSharedInstancePool($className, $instance);')
            ->stopIndention()
            ->add('}')
            ->add('')
            ->add('return $this->getFromSharedInstancePool($className);');

        $fetchFromSharedInstancePool->setBody($fetchFromSharedInstancePoolBody, array('object'));
        $fetchFromSharedInstancePool->getDocumentation()->addThrows('InvalidArgumentException');
        //begin of add to shared instance pool
        $addToSharedInstancePoolBody    = $blockGeneratorFactory->create();
        $addToSharedInstancePool        = $methodGeneratorFactory->create();

        $addToSharedInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $addToSharedInstancePool->setName('addToSharedInstancePool');
        $addToSharedInstancePool->addParameter('className', null, 'string');
        $addToSharedInstancePool->addParameter('instance', null, 'object');
        $addToSharedInstancePool->markAsPrivate();

        $addToSharedInstancePoolBody
            ->add('$this->sharedInstancePool[$className] = $instance;')
            ->add('')
            ->add('return $this;');

        $addToSharedInstancePool->setBody($addToSharedInstancePoolBody, array('$this'));
        //end of add to shared instance pool
        //begin of get from shared instance pool
        $getFromSharedInstancePoolBody = $blockGeneratorFactory->create();
        $getFromSharedInstancePool = $methodGeneratorFactory->create();

        $getFromSharedInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $getFromSharedInstancePool->setName('getFromSharedInstancePool');
        $getFromSharedInstancePool->addParameter('className', null, 'string');
        $getFromSharedInstancePool->markAsPrivate();

        $getFromSharedInstancePoolBody
            ->add('return $this->sharedInstancePool[$className];');

        $getFromSharedInstancePool->setBody($getFromSharedInstancePoolBody, array('null', 'object'));
        //end of get from shared instance pool
        //begin of is not in shared instance pool
        $isNotInSharedInstancePoolBody = $blockGeneratorFactory->create();
        $isNotInSharedInstancePool = $methodGeneratorFactory->create();

        $isNotInSharedInstancePool->setDocumentation($documentationGeneratorFactory->create());
        $isNotInSharedInstancePool->setName('isNotInSharedInstancePool');
        $isNotInSharedInstancePool->addParameter('className', null, 'string');
        $isNotInSharedInstancePool->markAsPrivate();

        $isNotInSharedInstancePoolBody
            ->add('return (!isset($this->sharedInstancePool[$className]));');

        $isNotInSharedInstancePool->setBody($isNotInSharedInstancePoolBody, array('boolean'));
        //begin of is not in shared instance pool
        //begin of methods

        //begin of adding to class
        $classGenerator->addProperty($sharedInstancePool);

        //protected
        $classGenerator->addMethod($fetchFromSharedInstancePool);
        //private
        $classGenerator->addMethod($addToSharedInstancePool);
        $classGenerator->addMethod($getFromSharedInstancePool);
        $classGenerator->addMethod($isNotInSharedInstancePool);
        //end of adding to class

        return $classGenerator;
    }

    /**
     * @param BlockGeneratorFactory $blockGeneratorFactory
     * @param ClassGenerator $classGenerator
     * @param Configuration $configuration
     * @param DocumentationGeneratorFactory $documentationGeneratorFactory
     * @param MethodGeneratorFactory $methodGeneratorFactory
     * @return ClassGenerator
     */
    private function addInstanceFetching(
        BlockGeneratorFactory $blockGeneratorFactory,
        ClassGenerator $classGenerator,
        Configuration $configuration,
        DocumentationGeneratorFactory $documentationGeneratorFactory,
        MethodGeneratorFactory $methodGeneratorFactory
    )
    {
        foreach ($configuration->getInstances() as $instance) {
            $body           = $blockGeneratorFactory->create();
            $documentation  = $documentationGeneratorFactory->create();
            $method         = $methodGeneratorFactory->create();
            $methodBuilder  = $instance->getMethodBodyBuilder();
            $returnValue    = ($instance->hasReturnValue()) ? $instance->getReturnValue() : $instance->getClassName();

            $methodBuilder->setInstance($instance);
            $body           = $methodBuilder->build($body);
            $documentation  = $methodBuilder->extend($documentation);
            $method->setBody($body, array($returnValue));

            if ($instance->hasAlias()) {
                $methodName = $instance->getAlias();
            } else {
                $methodName = (str_replace('\\', '' , $instance->getClassName()));
            }

            $methodName = $configuration->getMethodPrefix() . ucfirst($methodName);

            $method->setDocumentation($documentation);
            $method->setName($methodName);
            $method->markAsPublic();

            $classGenerator->addMethod($method);
        }

        return $classGenerator;
    }

    /**
     * @param ClassGenerator $classGenerator
     * @return ClassGenerator
     */
    private function addImplementsLocatorInterface(
        ClassGenerator $classGenerator
    )
    {
        $classGenerator->addUse('Net\Bazzline\Component\Locator\LocatorInterface', 'LocatorInterface');
        $classGenerator->addImplements('LocatorInterface');

        return $classGenerator;
    }
}
PHP Locator Generator Component by bazzline.net API documentation generated by ApiGen