private function marshalStructure($object, PiBX_AST_Structure $ast) { $lastNode = $this->parentDomNode; if ($ast->getStructureType() === PiBX_AST_StructureType::CHOICE()) { $this->parentDomNode = $this->currentDomNode; if ($ast->hasChildren()) { $childrenCount = $ast->countChildren(); $currentChoice = null; for ($i = 0; $i < $childrenCount; $i++) { $child = $ast->get($i); $testMethod = $child->getTestMethod(); if ($object->{$testMethod}()) { $currentChoice = $child; break; } } $this->marshalObject($object, $currentChoice); } } elseif ($ast->getStructureType() === PiBX_AST_StructureType::ORDERED()) { throw new RuntimeException('Currently not supported.'); } else { $this->parentDomNode->removeChild($this->currentDomNode); // when a structure has no type, it is a referenced complex-type // used as a type-attribute $getter = $ast->getGetMethod(); $obj = $object->{$getter}(); $classname = $this->binding->getClassnameForName($ast->getName()); $structureAst = $this->binding->getASTForClass($classname); $this->marshalObject($obj, $structureAst); } $this->parentDomNode = $lastNode; }