src/Abstracts/aModel.php
public function validateValues($objValues, bool $checkAll = false) : bool
    {
        $validateResult = [];
        $validateState  = [];
        $validateCanSet = [];
        $fails          = 0;

        if (is_iterable($objValues) === false) {
            $fails++;
            $validateState = "error.dm.model.expected.iterable.object";
            $validateCanSet[] = false;
        } else {
            $hasInvalidField = false;

            // Testa cada uma das propriedades definidas...
            foreach ($objValues as $fieldName => $fieldValue) {
                $field = $this->getField($fieldName);

                if ($field === null) {
                    $fails++;
                    $validateResult[$fieldName] = "error.dm.model.unespected.field.name";
                    $validateCanSet[] = false;
                    $hasInvalidField = true;
                } else {
                    if ($field->validateValue($fieldValue) === false) {
                        $fails++;
                    }
                    $validateResult[$field->getName()]  = $field->getLastValidateState();
                    $validateCanSet[] = $field->getLastValidateCanSet();
                }
            }


            if ($hasInvalidField === true) {
                $validateState = $validateResult;
            } else {
                if ($validateResult === []) {
                    $fails++;
                    $validateState      = "error.dm.model.value.not.allow.empty.object";
                    $validateCanSet[]   = false;
                } else {
                    $validateState = $validateResult;

                    if ($checkAll === true) {
                        $allFieldNames = $this->getFieldNames();

                        // Se o total de campos testados é diferente do total de campos existentes.
                        if (count($allFieldNames) !== count(array_keys($validateResult))) {
                            
                            // Verifica campo por campo para identificar os que
                            // não foram testados ainda.
                            foreach ($allFieldNames as $fieldName) {
                                if (key_exists($fieldName, $validateResult) === true) {
                                    $validateState[$fieldName] = $validateResult[$fieldName];
                                } else {
                                    $field = $this->getField($fieldName);
                                    $r = $field->validateValue($field->getDefault());
                                    if ($r === false) {
                                        $fails++;
                                    }
                                    $validateState[$fieldName] = $field->getLastValidateState();
                                    $validateCanSet[] = $field->getLastValidateCanSet();
                                }
                            }
                        }
                    }
                }
            }
        }

        $this->modelState_ValidateState         = (($fails === 0) ? "valid" : $validateState);
        $this->modelState_ValidateStateCanSet   = (in_array(false, $validateCanSet) === false);
        return ($fails === 0);
    }
public function validateValues($objValues, bool $checkAll = false) : bool
    {
        $validateResult = [];
        $validateState  = [];
        $validateCanSet = [];
        $fails          = 0;

        if (is_iterable($objValues) === false) {
            $fails++;
            $validateState = "error.dm.model.expected.iterable.object";
            $validateCanSet[] = false;
        } else {
            $hasInvalidField = false;

            // Testa cada uma das propriedades definidas...
            foreach ($objValues as $fieldName => $fieldValue) {
                $field = $this->getField($fieldName);

                if ($field === null) {
                    $fails++;
                    $validateResult[$fieldName] = "error.dm.model.unespected.field.name";
                    $validateCanSet[] = false;
                    $hasInvalidField = true;
                } else {
                    if ($field->validateValue($fieldValue) === false) {
                        $fails++;
                    }
                    $validateResult[$field->getName()]  = $field->getLastValidateState();
                    $validateCanSet[] = $field->getLastValidateCanSet();
                }
            }


            if ($hasInvalidField === true) {
                $validateState = $validateResult;
            } else {
                if ($validateResult === []) {
                    $fails++;
                    $validateState      = "error.dm.model.value.not.allow.empty.object";
                    $validateCanSet[]   = false;
                } else {
                    $validateState = $validateResult;

                    if ($checkAll === true) {
                        $allFieldNames = $this->getFieldNames();

                        // Se o total de campos testados é diferente do total de campos existentes.
                        if (count($allFieldNames) !== count(array_keys($validateResult))) {
                            
                            // Verifica campo por campo para identificar os que
                            // não foram testados ainda.
                            foreach ($allFieldNames as $fieldName) {
                                if (key_exists($fieldName, $validateResult) === true) {
                                    $validateState[$fieldName] = $validateResult[$fieldName];
                                } else {
                                    $field = $this->getField($fieldName);
                                    $r = $field->validateValue($field->getDefault());
                                    if ($r === false) {
                                        $fails++;
                                    }
                                    $validateState[$fieldName] = $field->getLastValidateState();
                                    $validateCanSet[] = $field->getLastValidateCanSet();
                                }
                            }
                        }
                    }
                }
            }
        }

        $this->modelState_ValidateState         = (($fails === 0) ? "valid" : $validateState);
        $this->modelState_ValidateStateCanSet   = (in_array(false, $validateCanSet) === false);
        return ($fails === 0);
    }
Verifica se o valor indicado satisfaz os critérios que de validação
dos campos em comum que ele tenha com o presente modelo de dados.

- A validação é feita seguindo os seguintes passos:
-- 1 Verifica se o valor passado é "iterable".
-- 2 Verifica se o valor passado possui alguma propriedade/campo
que seja inexistênte para o modelo de dados desta instância.
-- 3 Verifica se nenhuma propriedade foi encontrada no objeto passado.
-- 4 Se "checkAll" for definido como "true" então irá verificar se
restou ser apresentado algum campo obrigatorio. Campos que tenham
configuração de valor default não invalidarão este tipo de teste.


- Método "getLastValidateState"
Após uma validação é possível usar este método para averiguar com
precisão qual foi o motivo da falha.
Para os passos "1" e "3" será retornado uma string única com o código
do erro.
Para os passos "2" e "4" será retornado um array associativo contendo
uma chave para cada campo testado e seu respectivo código de validação.

@param       mixed $objValues
Objeto que traz os valores a serem testados.

@param       bool $checkAll
Quando "true" apenas confirmará a validade da coleção de
valores se com os mesmos for possível preencher todos os
campos obrigatórios deste modelo de dados.
Campos não declarados mas que possuem um valor padrão
definido SEMPRE passarão neste tipo de validação

@return      bool

@throws      \InvalidArgumentException
Caso o objeto passado possua propriedades não correspondentes
aos campos definidos.