protected static function resolveColumnTypeAndLengthFromRules($modelClassName, $member, array $rules, &$type, &$length, &$notNull, &$default, &$messageLogger)
 {
     $suitableModelClassName = static::findSuitableModelClassName($modelClassName);
     if (!$suitableModelClassName) {
         $messageLogger->addErrorMessage(Zurmo::t('Core', 'Unable to find a suitable non-abstract class for' . ' validators against {{model}}', array('{{model}}' => $modelClassName)));
         return;
     }
     $model = $suitableModelClassName::model();
     $yiiValidators = CValidator::$builtInValidators;
     $yiiValidatorsToRedBeanValidators = RedBeanModel::getYiiValidatorsToRedBeanValidators();
     foreach ($rules as $validatorMetadata) {
         assert('isset($validatorMetadata[0])');
         assert('isset($validatorMetadata[1])');
         $validatorName = $validatorMetadata[1];
         $validatorParameters = array_slice($validatorMetadata, 2);
         if (isset($yiiValidators[$validatorName])) {
             $validatorName = $yiiValidators[$validatorName];
         }
         if (isset($yiiValidatorsToRedBeanValidators[$validatorName])) {
             $validatorName = $yiiValidatorsToRedBeanValidators[$validatorName];
         }
         if (!@class_exists($validatorName)) {
             continue;
         }
         $validator = CValidator::createValidator($validatorName, $model, $member, $validatorParameters);
         switch ($validatorName) {
             case 'RedBeanModelTypeValidator':
             case 'TypeValidator':
             case 'CTypeValidator':
                 if (in_array($validator->type, array('blob', 'boolean', 'date', 'datetime', 'longblob', 'string', 'float', 'integer', 'time', 'text', 'longtext'))) {
                     if (!isset($type) || $validator->type == 'float') {
                         $type = $validator->type;
                     }
                 }
                 break;
             case 'CBooleanValidator':
                 $type = 'boolean';
                 break;
             case 'CStringValidator':
                 if (!isset($type) || $type == 'string') {
                     static::resolveStringTypeAndLengthByMaxLength($type, $length, $validator->max);
                 }
                 break;
             case 'CUrlValidator':
                 $type = 'string';
                 if (!isset($length)) {
                     $length = 255;
                 }
                 break;
             case 'CEmailValidator':
                 $type = 'string';
                 if (!isset($length)) {
                     $length = 255;
                 }
                 break;
             case 'RedBeanModelNumberValidator':
             case 'CNumberValidator':
                 if ((!isset($type) || $type == 'integer') && !isset($validator->precision)) {
                     static::resolveIntegerTypeByMinAndMaxValue($type, $validator->min, $validator->max);
                 }
                 break;
             case 'RedBeanModelDefaultValueValidator':
             case 'CDefaultValueValidator':
                 // Left here for future use if we want to set defaults on db level too.
                 //$default              = 'DEFAULT ' . $validator->value;
                 break;
             case 'RedBeanModelRequiredValidator':
             case 'CRequiredValidator':
                 //$notNull = 'NOT NULL'; // Not Coding Standard
                 // Left here for future use if we want to set required on db level too.
                 break;
             case 'RedBeanModelUniqueValidator':
             case 'CUniqueValidator':
                 static::registerUniqueIndexByMemberName($member, $modelClassName);
                 break;
         }
     }
     // we have a string and we don't know anything else about it, better to set it as text.
     if ($type == 'string' && !isset($length)) {
         $type = 'text';
     }
 }