/**
* Create asset instance.
*
* @param string $alias
* @param mixed $source
* @param string|array $dependencies
* @param string|array $options
* @throws Exception
* @return Asset
*/
public function create($alias, $source, $dependencies = [], $options = [])
{
$assetType = isset($options['type']) ? $options['type'] : '';
if (isset($this->_customTypes[$assetType])) {
$assetType = $this->_customTypes[$assetType];
} elseif (is_callable($source)) {
$assetType = 'Callback';
} elseif (is_string($source)) {
$ext = strtolower(FS::ext($source));
if ($ext === 'js') {
$assetType = 'JsFile';
} elseif ($ext === 'css') {
$assetType = 'CssFile';
} elseif ($ext === 'less') {
$assetType = 'LessFile';
} elseif ($ext === 'jsx') {
$assetType = 'JsxFile';
}
} elseif (is_array($source)) {
$assetType = 'Collection';
}
$className = __NAMESPACE__ . '\\Asset\\' . $assetType;
if (class_exists($className)) {
$options = is_array($options) ? new Data($options) : $options;
return new $className($this->getManager(), $alias, $source, $dependencies, $options);
}
throw new Exception('Undefined asset type: ' . print_r($source, true));
}