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); } }
/** * @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'); } }
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())); }