public function assembleSegment($segment) { $assembler = null; if (is_scalar($segment)) { return $segment; } else { if ($segment instanceof IStatement) { $assembler = new StatementAssembler($segment); } else { if ($segment instanceof IClause) { $assembler = new ClauseAssembler($segment); } else { if ($segment instanceof IPredicate) { $assembler = new PredicateAssembler($segment); } else { if ($segment instanceof ISelectExpression) { $assembler = new SelectExpressionAssembler($segment); } else { if ($segment instanceof IExpression) { $assembler = new ExpressionAssembler($segment); } else { throw new \Exception("Unsupported segment type " . get_class($segment)); } } } } } } $assembler->setAssembler($this); return $assembler->assemble(); }