/**
  * Build generators
  *
  * @param  State|\Scaffold\State $state
  * @return \Scaffold\State|void
  */
 public function build(State $state)
 {
     $model = $this->model;
     $generator = new ClassGenerator($model->getName());
     $generator->addUse('Zend\\ServiceManager\\FactoryInterface');
     $generator->addUse('Zend\\ServiceManager\\ServiceLocatorInterface');
     $generator->addUse('Zend\\ServiceManager\\ServiceManager');
     $generator->addUse($state->getServiceModel()->getName());
     $generator->setImplementedInterfaces(['FactoryInterface']);
     $method = new MethodGenerator('createService');
     $method->setParameter(new ParameterGenerator('serviceLocator', 'ServiceLocatorInterface'));
     $method->setBody('return new ' . $state->getServiceModel()->getClassName() . '($serviceLocator);');
     $doc = new DocBlockGenerator('Create service');
     $doc->setTag(new Tag\GenericTag('param', 'ServiceLocatorInterface|ServiceManager $serviceLocator'));
     $doc->setTag(new Tag\GenericTag('return', $state->getServiceModel()->getClassName()));
     $method->setDocBlock($doc);
     $generator->addMethodFromGenerator($method);
     $model->setGenerator($generator);
 }
    /**
     * Build generators
     *
     * @param  State|\Scaffold\State $state
     * @return \Scaffold\State|void
     */
    public function build(State $state)
    {
        $model = $this->model;
        $generator = new TraitGenerator($model->getName());
        $generator->addUse($state->getServiceModel()->getName());
        $generator->addUse($state->getModel('RuntimeException')->getName());
        $generator->addUse('Zend\\ServiceManager\\ServiceLocatorAwareInterface');
        $generator->addUse('Zend\\ServiceManager\\ServiceLocatorInterface');
        $property = lcfirst($state->getServiceModel()->getClassName());
        $class = $state->getServiceModel()->getClassName();
        $alias = $state->getServiceModel()->getServiceName();
        $code = <<<EOF
if (null === \$this->{$property}) {
    if (\$this instanceof ServiceLocatorAwareInterface || method_exists(\$this, 'getServiceLocator')) {
        \$this->{$property} = \$this->getServiceLocator()->get('{$alias}');
    } else {
        if (property_exists(\$this, 'serviceLocator')
            && \$this->serviceLocator instanceof ServiceLocatorInterface
        ) {
            \$this->{$property} = \$this->serviceLocator->get('{$alias}');
        } else {
            throw new RuntimeException('Service locator not found');
        }
    }
}
return \$this->{$property};
EOF;
        $this->addProperty($generator, $property, $class);
        $this->addSetter($generator, $property, $class);
        $getter = $this->getGetter($property, $class);
        $getter->setBody($code);
        $getter->getDocBlock()->setTag(new Tag\GenericTag('throws', $state->getModel('RuntimeException')->getClassName()));
        $generator->addMethodFromGenerator($getter);
        //
        $model->setGenerator($generator);
    }
 /**
  * Build generators
  *
  * @param  State|\Scaffold\State $state
  * @return \Scaffold\State|void
  */
 public function build(State $state)
 {
     $model = $state->getServiceModel();
     $generator = new ClassGenerator($model->getName());
     $generator->setImplementedInterfaces(['ServiceLocatorAwareInterface']);
     $generator->addUse('Doctrine\\ORM\\EntityManager');
     $generator->addUse($state->getEntityModel()->getName());
     $generator->addUse($state->getModel('NotFoundException')->getName());
     $generator->addUse($state->getModel('repository-trait')->getName());
     $generator->addUse('Zend\\ServiceManager\\ServiceLocatorAwareInterface');
     $generator->addUse('Zend\\ServiceManager\\ServiceLocatorAwareTrait');
     $generator->addUse('Zend\\ServiceManager\\ServiceLocatorInterface');
     $generator->addTrait('ServiceLocatorAwareTrait');
     $generator->addTrait($state->getModel('repository-trait')->getClassName());
     $this->addProperty($generator, 'entityManager', 'EntityManager');
     $this->buildConstructor($generator);
     $this->buildLoadById($generator, $state);
     $this->buildSearch($generator, $state);
     $this->buildSave($generator, $state);
     $this->buildDelete($generator, $state);
     $this->buildEntityManager($generator);
     $this->buildFactory($generator, $state);
     $model->setGenerator($generator);
 }
    /**
     * @param ClassGenerator $generator
     * @param State          $state
     */
    public function addGetObject(ClassGenerator $generator, State $state)
    {
        $className = $state->getServiceModel()->getClassName();
        $doc = "@param array \$methods\n@return \\PHPUnit_Framework_MockObject_MockObject|" . $className;
        $class = $state->getServiceModel()->getName();
        $repository = ucfirst($state->getRepositoryModel()->getClassName());
        $body = <<<EOF
if (count(\$methods)) {
    \$object = \$this->getMockBuilder('{$class}')
        ->disableOriginalConstructor()
        ->setMethods(\$methods)
        ->getMock();
} else {
    \$object = new {$className}(\$this->getServiceManager());
}

\$object->set{$repository}(\$this->getRepository());
\$object->setEntityManager(\$this->getEntityManager());

return \$object;
EOF;
        $method = new MethodGenerator('getObject', [], MethodGenerator::FLAG_PUBLIC, $body, $doc);
        $method->setParameter(new ParameterGenerator('methods', 'array', []));
        $generator->addMethodFromGenerator($method);
    }
    public function buildEditAction(ClassGenerator $generator, State $state)
    {
        $service = 'get' . $state->getServiceModel()->getClassName();
        $name = lcfirst($state->getEntityModel()->getClassName());
        $method = new MethodGenerator('editAction');
        $method->setDocBlock(new DocBlockGenerator('Show one entity'));
        $method->setBody(<<<EOF
            \$id = \$this->params()->fromRoute('id');
\${$name} = \$this->{$service}()->loadById(\$id);
/** @var Form \$form */
\$form = \$this->getServiceLocator()->get('{$state->getFormFactoryModel()->getServiceName()}');
\$form->bind(\${$name});

if (\$this->getRequest()->isPost()) {
    \$form->setData(\$this->params()->fromPost());
    if (\$form->isValid()) {
        \$this->{$service}()->save(\${$name});
        \$this->getEntityManager()->flush();

        \$this->flashMessenger()->addSuccessMessage('Saved');
        \$this->redirect()->toRoute('home');
    }
}

return array(
    'form' => \$form
);
EOF
);
        $generator->addMethodFromGenerator($method);
    }