src/Abstracts/aField.php
protected function individualValue_CheckValue($v) : array
    {
        $canSet = true;
        $state  = "valid";


        // Primeira validação é a de possibilidade de
        // redefinir o valor do campo.
        if ($this->isReadOnly() === true && $this->value !== undefined) {
            $canSet = false;
            $state  = "error.dm.field.value.constraint.read.only";
        }


        // Sendo possível redefinir o campo, prossegue com a validação
        if ($canSet === true) {

            if ($v === undefined) { 
                $canSet = false;
                $state  = "error.dm.field.value.not.allow.undefined";
            } elseif ($v === null) {
                if ($this->isAllowNull() === false) {
                    $canSet = false;
                    $state = "error.dm.field.value.not.allow.null";
                } 
            } elseif ($v === "") {
                if ($this->isAllowEmpty() === false) {
                    $canSet = false;
                    $state = "error.dm.field.value.not.allow.empty";

                    // Verifica casos onde "" será convertido em "null"
                    if ($this->isConvertEmptyToNull() === true && $this->isAllowNull() === true) {
                        $canSet = true;
                        $state = "valid";
                    }
                }
            } elseif (is_array($v) === true) {
                $canSet = false;
                $state = "error.dm.field.value.not.allow.array";
            } else {

                // Verifica se o valor passado é de um tipo válido.
                $isValidType = (
                    is_bool($v) === true ||
                    is_int($v) === true ||
                    is_float($v) === true ||
                    is_string($v) === true ||
                    is_a($v, "\DateTime") === true ||
                    is_a($v, "AeonDigital\\Numbers\\RealNumber") === true);

                if ($isValidType === false) {
                    $canSet = false;
                    $state  = "error.dm.field.value.invalid.type";
                } else {
                    $sVal = $v;

                    // Havendo um "inputFormat" definido e o valor passado seja uma string
                    if ($this->inputFormat !== null && is_string($v) === true) {
                        // Verifica se é um valor válido para o "inputFormat" definido,
                        if ($this->inputFormat["check"]($v) === false) {
                            // Se o campo está esperando um valor de um tipo que NÃO
                            // seja uma string, impede o valor de ser definido.
                            if ($this->isSimpleTypeString() === false) {
                                $canSet = false;
                            } 
                            $state = "error.dm.field.value.invalid.input.format";
                        } 
                        // Caso passe na validação do tipo, efetuará a conversão 
                        // para o type original ou removerá completamente toda formatação
                        // usada até o momento.
                        else {
                            $sVal = $this->inputFormat["storageFormat"]($v);

                            // Se o campo está definido para armazenar strings mas o "inputType"
                            // permite representar outros tipos, reverte a conversão do valor para
                            // o tipo nativo deste campo.
                            if ($this->isSimpleTypeString() === true && is_string($sVal) === false) {
                                $sVal = $this->inputFormat["format"]($sVal);
                            }
                        }
                    } else {
                        // Força o valor passado para que ele retorne ao
                        // tipo original.
                        $stErr = null;
                        $sVal = $this->type::parseIfValidate($v, $stErr);

                        // Caso não tenha sido possível retomar o tipo original
                        // do valor... 
                        if ($stErr !== null) {
                            $canSet = false;
                            $state  = $stErr;
                        }
                    }



                    // Chegando aqui e ainda podendo definir o campo significa
                    // que é possível reverter o valor passado para seu tipo original
                    // ou que ele já é um objeto do tipo esperado por "type".
                    // Em todo caso é esperado um valor totalmente "limpo" de qualquer
                    // formatação.
                    if ($canSet === true) {
                        
                        // Havendo um enumerador definido, testa o valor conforme
                        // a coleção válida.
                        if ($this->enumerator !== null) {
                            $r = false;

                            foreach ($this->enumerator as $enum) {
                                $eVal = ((is_array($enum) === true) ? $enum[0] : $enum);
                                if ($sVal === $eVal) { $r = true; }
                            }

                            if ($r === false) {
                                $state = "error.dm.field.value.constraint.enumerator.violated";
                            }
                        } else {

                            // Se tratar-se de uma string, verifica se a mesma
                            // extrapolou o limite de tamanho definido.
                            if ($this->isSimpleTypeString() === true && $this->getLength() !== null && mb_strlen($sVal) > $this->getLength()) {
                                $state = "error.dm.field.value.constraint.length.violated";
                            } 
                            // Tratando-se de um tipo numérico, ou de uma data
                            elseif ($this->isSimpleTypeNumeric() === true || $this->isSimpleTypeDateTime() === true) {
                                $min = $this->getMin();
                                $max = $this->getMax();

                                // Para casos de números reais "RealNumber"
                                if ($this->isSimpleTypeReal() === true) {
                                    if (($min !== null && $sVal->isLessThan($min) === true) ||
                                        ($max !== null && $sVal->isGreaterThan($max) === true)) {
                                        $state = "error.dm.field.value.constraint.range.violated";
                                    }
                                } else {
                                    if (($min !== null && $sVal < $min) ||
                                        ($max !== null && $sVal > $max)) {
                                        $state = "error.dm.field.value.constraint.range.violated";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }


        return [
            "canSet"    => $canSet,
            "valid"     => ($state === "valid"),
            "state"     => $state,
            "cState"    => null
        ];
    }
protected function individualValue_CheckValue($v) : array
    {
        $canSet = true;
        $state  = "valid";


        // Primeira validação é a de possibilidade de
        // redefinir o valor do campo.
        if ($this->isReadOnly() === true && $this->value !== undefined) {
            $canSet = false;
            $state  = "error.dm.field.value.constraint.read.only";
        }


        // Sendo possível redefinir o campo, prossegue com a validação
        if ($canSet === true) {

            if ($v === undefined) { 
                $canSet = false;
                $state  = "error.dm.field.value.not.allow.undefined";
            } elseif ($v === null) {
                if ($this->isAllowNull() === false) {
                    $canSet = false;
                    $state = "error.dm.field.value.not.allow.null";
                } 
            } elseif ($v === "") {
                if ($this->isAllowEmpty() === false) {
                    $canSet = false;
                    $state = "error.dm.field.value.not.allow.empty";

                    // Verifica casos onde "" será convertido em "null"
                    if ($this->isConvertEmptyToNull() === true && $this->isAllowNull() === true) {
                        $canSet = true;
                        $state = "valid";
                    }
                }
            } elseif (is_array($v) === true) {
                $canSet = false;
                $state = "error.dm.field.value.not.allow.array";
            } else {

                // Verifica se o valor passado é de um tipo válido.
                $isValidType = (
                    is_bool($v) === true ||
                    is_int($v) === true ||
                    is_float($v) === true ||
                    is_string($v) === true ||
                    is_a($v, "\DateTime") === true ||
                    is_a($v, "AeonDigital\\Numbers\\RealNumber") === true);

                if ($isValidType === false) {
                    $canSet = false;
                    $state  = "error.dm.field.value.invalid.type";
                } else {
                    $sVal = $v;

                    // Havendo um "inputFormat" definido e o valor passado seja uma string
                    if ($this->inputFormat !== null && is_string($v) === true) {
                        // Verifica se é um valor válido para o "inputFormat" definido,
                        if ($this->inputFormat["check"]($v) === false) {
                            // Se o campo está esperando um valor de um tipo que NÃO
                            // seja uma string, impede o valor de ser definido.
                            if ($this->isSimpleTypeString() === false) {
                                $canSet = false;
                            } 
                            $state = "error.dm.field.value.invalid.input.format";
                        } 
                        // Caso passe na validação do tipo, efetuará a conversão 
                        // para o type original ou removerá completamente toda formatação
                        // usada até o momento.
                        else {
                            $sVal = $this->inputFormat["storageFormat"]($v);

                            // Se o campo está definido para armazenar strings mas o "inputType"
                            // permite representar outros tipos, reverte a conversão do valor para
                            // o tipo nativo deste campo.
                            if ($this->isSimpleTypeString() === true && is_string($sVal) === false) {
                                $sVal = $this->inputFormat["format"]($sVal);
                            }
                        }
                    } else {
                        // Força o valor passado para que ele retorne ao
                        // tipo original.
                        $stErr = null;
                        $sVal = $this->type::parseIfValidate($v, $stErr);

                        // Caso não tenha sido possível retomar o tipo original
                        // do valor... 
                        if ($stErr !== null) {
                            $canSet = false;
                            $state  = $stErr;
                        }
                    }



                    // Chegando aqui e ainda podendo definir o campo significa
                    // que é possível reverter o valor passado para seu tipo original
                    // ou que ele já é um objeto do tipo esperado por "type".
                    // Em todo caso é esperado um valor totalmente "limpo" de qualquer
                    // formatação.
                    if ($canSet === true) {
                        
                        // Havendo um enumerador definido, testa o valor conforme
                        // a coleção válida.
                        if ($this->enumerator !== null) {
                            $r = false;

                            foreach ($this->enumerator as $enum) {
                                $eVal = ((is_array($enum) === true) ? $enum[0] : $enum);
                                if ($sVal === $eVal) { $r = true; }
                            }

                            if ($r === false) {
                                $state = "error.dm.field.value.constraint.enumerator.violated";
                            }
                        } else {

                            // Se tratar-se de uma string, verifica se a mesma
                            // extrapolou o limite de tamanho definido.
                            if ($this->isSimpleTypeString() === true && $this->getLength() !== null && mb_strlen($sVal) > $this->getLength()) {
                                $state = "error.dm.field.value.constraint.length.violated";
                            } 
                            // Tratando-se de um tipo numérico, ou de uma data
                            elseif ($this->isSimpleTypeNumeric() === true || $this->isSimpleTypeDateTime() === true) {
                                $min = $this->getMin();
                                $max = $this->getMax();

                                // Para casos de números reais "RealNumber"
                                if ($this->isSimpleTypeReal() === true) {
                                    if (($min !== null && $sVal->isLessThan($min) === true) ||
                                        ($max !== null && $sVal->isGreaterThan($max) === true)) {
                                        $state = "error.dm.field.value.constraint.range.violated";
                                    }
                                } else {
                                    if (($min !== null && $sVal < $min) ||
                                        ($max !== null && $sVal > $max)) {
                                        $state = "error.dm.field.value.constraint.range.violated";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }


        return [
            "canSet"    => $canSet,
            "valid"     => ($state === "valid"),
            "state"     => $state,
            "cState"    => null
        ];
    }
Verifica um valor de forma individual e retorna um array
com informações sobre sua validação.

@param       mixed $v
Valor que será testado.

@return      array

$arr = [
"canSet"    bool            Indica se o valor pode ou não ser definido para o campo.
"valid"     bool            Indica se o valor pode ser aceito por este campo.
"state"     string          Código do estado da validação.
"cState"    null            Código do estado da coleção validada.
]