protected function _castArray($object, $val, $pathKey, $options, $defaults)
{
$isArray = $this->is('array', $pathKey) && !$options['asContent'] && !$object instanceof $this->_classes['set'];
$isObject = $this->type($pathKey) === 'object';
$valIsArray = is_array($val);
$numericArray = false;
$class = 'entity';
if (!$valIsArray && !$isArray) {
return $this->_castType($val, $pathKey);
}
if ($valIsArray) {
$numericArray = !$val || array_keys($val) === range(0, count($val) - 1);
}
if ($isArray || $numericArray && !$isObject) {
$val = $valIsArray ? $val : array($val);
$class = 'set';
}
if ($options['wrap']) {
$config = array('parent' => $options['parent'], 'model' => !$options['model'] && $object ? $object->model() : $options['model'], 'schema' => $this);
$config += compact('pathKey') + array_diff_key($options, $defaults);
if (!$pathKey && ($model = $options['model'])) {
$exists = is_object($object) ? $object->exists() : false;
$config += array('class' => $class, 'exists' => $exists, 'defaults' => false);
$val = $model::create($val, $config);
} else {
$config['data'] = $val;
$val = $this->_instance($class, $config);
}
} elseif ($class === 'set') {
$val = $val ?: array();
foreach ($val as &$value) {
$value = $this->_castType($value, $pathKey);
}
}
return $val;
}