/**
  * Returns the class for the control that will be created to edit the given column,
  * including the 'virtual' columns of reverse references (many to one) and many-to-many references.
  *
  * @param QSqlColumn|QReverseReference|QManyToManyReference $objColumn
  *
  * @return AbstractControl_CodeGenerator helper object
  * @throws Exception
  */
 public function GetControlCodeGenerator($objColumn)
 {
     $strControlClass = $this->ModelConnectorControlClass($objColumn);
     if (method_exists($strControlClass, 'GetCodeGenerator')) {
         return call_user_func($strControlClass . '::GetCodeGenerator');
     }
     switch ($strControlClass) {
         case 'QLabel':
             return QLabel_CodeGenerator::Instance();
         case 'QListBox':
             return new QListBox_CodeGenerator();
         case 'QCheckBox':
             return new QCheckBox_CodeGenerator();
         case 'QDateTimePicker':
             return new QDateTimePicker_CodeGenerator();
         case 'QTextBox':
             return new QTextBox_CodeGenerator();
         case 'QIntegerTextBox':
             return new QIntegerTextBox_CodeGenerator();
         case 'QFloatTextBox':
             return new QFloatTextBox_CodeGenerator();
         case 'QCheckBoxList':
             return new QCheckBoxList_CodeGenerator();
         default:
             break;
     }
     $strOrigControlClass = $strControlClass;
     $strControlCodeGeneratorClass = $strControlClass . '_CodeGenerator';
     while (!class_exists($strControlCodeGeneratorClass)) {
         $strControlClass = get_parent_class($strControlClass);
         if ($strControlClass === 'QControl') {
             throw new QCallerException("Cannot find an appropriate subclass of AbstractControl_CodeGenerator for " . $strOrigControlClass);
         }
         $strControlCodeGeneratorClass = $strControlClass . '_CodeGenerator';
     }
     return new $strControlCodeGeneratorClass($strOrigControlClass);
 }
        echo QLabel_CodeGenerator::Instance()->ConnectorCreate($objCodeGen, $objTable, $objColumn);
    }
    echo "\n\n";
}
foreach ($objTable->ReverseReferenceArray as $objReverseReference) {
    if (!$objReverseReference->Unique) {
        continue;
    }
    if (isset($objReverseReference->Options['FormGen']) && $objReverseReference->Options['FormGen'] == QFormGen::None) {
        continue;
    }
    $objControlCodeGenerator = $objCodeGen->GetControlCodeGenerator($objReverseReference);
    echo $objControlCodeGenerator->ConnectorCreate($objCodeGen, $objTable, $objReverseReference);
    if ($objControlCodeGenerator->GetControlClass() != 'QLabel' && (!isset($objReverseReference->Options['FormGen']) || $objReverseReference->Options['FormGen'] == QFormGen::Both)) {
        // also generate a QLabel for each control that generates both
        echo QLabel_CodeGenerator::Instance()->ConnectorCreate($objCodeGen, $objTable, $objReverseReference);
    }
    echo "\n\n";
}
foreach ($objTable->ManyToManyReferenceArray as $objManyToManyReference) {
    if (isset($objManyToManyReference->Options['FormGen']) && $objManyToManyReference->Options['FormGen'] == QFormGen::None) {
        continue;
    }
    $objControlCodeGenerator = $objCodeGen->GetControlCodeGenerator($objManyToManyReference);
    echo $objControlCodeGenerator->ConnectorCreate($objCodeGen, $objTable, $objManyToManyReference);
    if ($objControlCodeGenerator->GetControlClass() != 'QLabel' && (!isset($objManyToManyReference->Options['FormGen']) || $objManyToManyReference->Options['FormGen'] == QFormGen::Both)) {
        // also generate a QLabel for each control that generates both
        echo QLabel_CodeGenerator::Instance()->ConnectorCreate($objCodeGen, $objTable, $objManyToManyReference);
    }
    echo "\n\n";
}
foreach ($objTable->ReverseReferenceArray as $objReverseReference) {
    if (!$objReverseReference->Unique) {
        continue;
    }
    if (isset($objReverseReference->Options['FormGen']) && $objReverseReference->Options['FormGen'] == QFormGen::None) {
        continue;
    }
    $objControlCodeGenerator = $objCodeGen->GetControlCodeGenerator($objReverseReference);
    echo $objControlCodeGenerator->ConnectorVariableDeclaration($objCodeGen, $objReverseReference);
    if ($objControlCodeGenerator->GetControlClass() != 'QLabel' && (!isset($objReverseReference->Options['FormGen']) || $objReverseReference->Options['FormGen'] == QFormGen::Both)) {
        // also generate a QLabel for each control that is not defaulted as a label already
        echo QLabel_CodeGenerator::Instance()->ConnectorVariableDeclaration($objCodeGen, $objReverseReference);
    }
}
foreach ($objTable->ManyToManyReferenceArray as $objManyToManyReference) {
    if (isset($objManyToManyReference->Options['FormGen']) && $objManyToManyReference->Options['FormGen'] == QFormGen::None) {
        continue;
    }
    $objControlCodeGenerator = $objCodeGen->GetControlCodeGenerator($objManyToManyReference);
    echo $objControlCodeGenerator->ConnectorVariableDeclaration($objCodeGen, $objManyToManyReference);
    if ($objControlCodeGenerator->GetControlClass() != 'QLabel' && (!isset($objManyToManyReference->Options['FormGen']) || $objManyToManyReference->Options['FormGen'] == QFormGen::Both)) {
        // also generate a QLabel for each control that is not defaulted as a label already
        echo QLabel_CodeGenerator::Instance()->ConnectorVariableDeclaration($objCodeGen, $objManyToManyReference);
    }
    ?>
		protected $str<?php 
    echo $objManyToManyReference->ObjectDescription;
    ?>
Glue = ', ';
<?php 
}