public function validateValue($validValues, &$val)
{
if (is_array($validValues)) {
if (isset($validValues[0])) {
return in_array($val, $validValues);
} else {
$values = array_values($validValues);
return in_array($val, $values);
}
} elseif ($validValues instanceof Closure) {
$validValues->bindTo($this);
return $validValues($val);
} else {
switch ($validValues) {
case self::Integer:
if (is_int($val)) {
return true;
}
if (is_numeric($val)) {
$val = intval($val);
return true;
}
return false;
case self::String:
return is_string($val);
case self::Boolean:
if (is_bool($val)) {
return true;
}
if ($val == '0' || $val == '1' || $val == 'true' || $val == 'false') {
$val = boolval($val);
return true;
}
return false;
case self::Float:
if (is_float($val)) {
return true;
}
// we should validate float format
if (is_numeric($val)) {
$val = floatval($val);
return true;
}
return false;
default:
return true;
}
}
return true;
}