protected function injectToSetter(GClass $gClass)
 {
     $setter = 'set' . $this->relation->getSourceMethodName();
     if (!$gClass->hasOwnMethod($setter)) {
         throw new \RuntimeException('in der Klasse kann ' . $setter . ' nicht gefunden werden. Womöglich muss der Setter vererbt werden');
     } else {
         $setter = $gClass->getMethod($setter);
     }
     if ($this->relation->isTargetNullable()) {
         $firstParam = current($setter->getParameters());
         $firstParam->setOptional(TRUE)->setDefault(NULL);
     }
     if ($this->relation->shouldUpdateOtherSide()) {
         // wenn die Relation bidrektional ist muss der normale setter auf der Inverse side addXXX auf der aufrufen
         // das ist aber gar nicht so trivial, weil wie wird removed?
         // before('return $this').insert(...)
         $body = $setter->getBodyCode();
         $lastLine = array_pop($body);
         if (\Psc\Preg::match($lastLine, '/^\\s*return \\$this;$/') <= 0) {
             throw new \Psc\Exception('EntityRelationInterfaceBuilder möchte den Setter: ' . $setter->getName() . ' für ' . $gClass . ' ergänzen, aber der Body code scheint kein autoGenererierter zu sein.');
         }
         $body[] = \Psc\TPL\TPL::miniTemplate(($this->relation->isTargetNullable() ? 'if (isset($%paramName%)) ' : NULL) . '$%paramName%->add%otherMethodName%($this);' . "\n", array('paramName' => $this->relation->getTarget()->getParamName(), 'otherMethodName' => $this->relation->getSource()->getMethodName('singular')));
         $body[] = $lastLine;
         $setter->setBodyCode($body);
     }
 }
Пример #2
0
 /**
  * @return GMethod
  */
 public function getParentsMethod($name)
 {
     if ($this->parentClass) {
         if ($this->parentClass->hasOwnMethod($name)) {
             return $this->parentClass->getMethod($name);
         } else {
             return $this->parentClass->getParentsMethod($name);
             // es kann nie zur exception komen wenn man vorher mit hasMethod gecheckt hat, dass es die methode in der hierarchy gibt
         }
     } else {
         throw new \RuntimeException('getParentsMethod für ' . $this->getFQN() . ' ist nicht defined, da es keine parentClass gibt');
     }
 }
Пример #3
0
 public function testOwnMethodsGetter()
 {
     $gClass = new GClass($refl = new ReflectionClass('Psc\\Code\\Compile\\Compiler'));
     $this->assertEquals('\\Psc\\Code\\Compile', $gClass->getNamespace());
     $gm = $gClass->getMethod('getClassName');
     // getClassName ist aus Psc\SimpleObject und somit eine Methode einer Vaterklasse
     $m = $refl->getMethod('getClassName');
     $this->assertEquals((string) $m->getDeclaringClass()->getName(), (string) $gm->getDeclaringClass()->getFQN());
     $this->assertArrayHasKey('getClassName', $gClass->getAllMethods());
     $this->assertArrayNotHasKey('getClassName', $gClass->getMethods());
     $this->assertLessThan(count($gClass->getAllMethods()), count($gClass->getMethods()));
     $m = $gClass->createMethod('Test');
     $this->assertNotEmpty($m->getDeclaringClass());
     /* BUG: Namespace verändern verändert die Rückggabe der Methoden */
     $gClass = GClass::factory('Psc\\Code\\Generate\\MyTestClass');
     $this->assertEquals(2, count($gClass->getMethods()));
     $this->assertEquals(2, count($gClass->getAllMethods()));
     $gClass->setNamespace('Psc\\Other\\Than\\Before');
     $this->assertEquals(2, count($gClass->getMethods()));
     $this->assertEquals(2, count($gClass->getAllMethods()));
 }