private static function _validate($fields, $path, $skip)
{
$parents = $path;
array_pop($parents);
$valid = true;
$blacklist = [];
if (is_object($fields)) {
if (in_array($fields, $skip, true)) {
return true;
}
$skip[] = $fields;
$blacklist = property_exists($fields, '_blacklist') ? $fields::$_blacklist : [];
}
foreach ($fields as $field => $value) {
if ($value === null || is_scalar($value) || in_array($field, $blacklist)) {
continue;
}
if (is_object($value)) {
if (method_exists($value, 'validate')) {
if (!$value->validate($path, $skip)) {
$valid = false;
}
} elseif (!self::_validate($value, $parents, $skip)) {
$valid = false;
}
} elseif (is_array($value) && !self::_validate($value, $parents, $skip)) {
$valid = false;
}
}
return $valid;
}