Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
52.63% covered (warning)
52.63%
10 / 19
CRAP
85.08% covered (warning)
85.08%
154 / 181
AssetFilesManager
0.00% covered (danger)
0.00%
0 / 1
52.63% covered (warning)
52.63%
10 / 19
99.72
85.08% covered (warning)
85.08%
154 / 181
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
2 / 3
 __destruct
0.00% covered (danger)
0.00%
0 / 1
5.67
33.33% covered (danger)
33.33%
2 / 6
 getCachedAssetsFiles
0.00% covered (danger)
0.00%
0 / 1
8.30
83.33% covered (warning)
83.33%
15 / 18
 cacheCssAssetFiles
100.00% covered (success)
100.00%
1 / 1
10
100.00% covered (success)
100.00%
27 / 27
 cacheLessAssetFiles
0.00% covered (danger)
0.00%
0 / 1
11.23
76.92% covered (warning)
76.92%
20 / 26
 cacheJsAssetFiles
100.00% covered (success)
100.00%
1 / 1
8
100.00% covered (success)
100.00%
16 / 16
 cacheMediaAssetFiles
0.00% covered (danger)
0.00%
0 / 1
7.05
90.00% covered (success)
90.00%
18 / 20
 rewriteAssetFileUrls
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 anonymousFunction:333#2062
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 rewriteUrl
0.00% covered (danger)
0.00%
0 / 1
13.58
77.78% covered (warning)
77.78%
21 / 27
 createTmpAssetFile
0.00% covered (danger)
0.00%
0 / 1
2.01
88.89% covered (warning)
88.89%
8 / 9
 setOptions
0.00% covered (danger)
0.00%
0 / 1
4.84
62.50% covered (warning)
62.50%
5 / 8
 getOptions
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
2 / 3
 setAssetFilesConfiguration
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getAssetFilesConfiguration
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 setAssetFileFiltersManager
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getAssetFileFiltersManager
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 setAssetFilesCacheManager
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getAssetFilesCacheManager
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
<?php
namespace AssetsBundle\AssetFile;
class AssetFilesManager
{
    /**
     * @var \AssetsBundle\Service\ServiceOptions
     */
    protected $options;
    /**
     * @var \AssetsBundle\AssetFile\AssetFilesConfiguration
     */
    protected $assetFilesConfiguration;
    /**
     * @var \AssetsBundle\AssetFile\AssetFileFiltersManager
     */
    protected $assetFileFiltersManager;
    /**
     * @var \AssetsBundle\AssetFile\AssetFilesCacheManager
     */
    protected $assetFilesCacheManager;
    /**
     * @var array
     */
    protected $tmpAssetFilesPathes = array();
    /**
     * Constructor
     *
     * @param \AssetsBundle\Service\ServiceOptions $oOptions
     */
    public function __construct(\AssetsBundle\Service\ServiceOptions $oOptions = null)
    {
        if ($oOptions) {
            $this->setOptions($oOptions);
        }
    }
    /**
     * On destruction, delete all existing tmp asset files
     */
    public function __destruct()
    {
        foreach ($this->tmpAssetFilesPathes as $sTmpAssetFilePath) {
            if (file_exists($sTmpAssetFilePath)) {
                \Zend\Stdlib\ErrorHandler::start();
                unlink($sTmpAssetFilePath);
                \Zend\Stdlib\ErrorHandler::stop(true);
            }
        }
    }
    /**
     * @param string $sAssetFileType
     * @return array
     * @throws \InvalidArgumentException
     * @throws \DomainException
     */
    public function getCachedAssetsFiles($sAssetFileType)
    {
        if (!\AssetsBundle\AssetFile\AssetFile::assetFileTypeExists($sAssetFileType)) {
            throw new \InvalidArgumentException('Asset file type "' . $sAssetFileType . '" is not valid');
        }
        // Production
        if ($this->getOptions()->isProduction()) {
            $oAssetFilesCacheManager = $this->getAssetFilesCacheManager();
            // Production cached asset files do not exist
            if (!$oAssetFilesCacheManager->hasProductionCachedAssetFiles($sAssetFileType)) {
                switch ($sAssetFileType) {
                    case \AssetsBundle\AssetFile\AssetFile::ASSET_JS:
                        $this->cacheJsAssetFiles();
                        break;
                    case \AssetsBundle\AssetFile\AssetFile::ASSET_CSS:
                        $this->cacheCssAssetFiles();
                        break;
                    default:
                        throw new \DomainException('Only "' . \AssetsBundle\AssetFile\AssetFile::ASSET_JS . '" & "' . \AssetsBundle\AssetFile\AssetFile::ASSET_CSS . '" assets file type can be retrieved');
                }
            }
            return $oAssetFilesCacheManager->getProductionCachedAssetFiles($sAssetFileType);
        }
         // Development
        switch ($sAssetFileType) {
            case \AssetsBundle\AssetFile\AssetFile::ASSET_JS:
                return $this->cacheJsAssetFiles();
            case \AssetsBundle\AssetFile\AssetFile::ASSET_CSS:
                return $this->cacheCssAssetFiles();
            default:
                throw new \DomainException('Only "' . \AssetsBundle\AssetFile\AssetFile::ASSET_JS . '" & "' . \AssetsBundle\AssetFile\AssetFile::ASSET_CSS . '" assets file type can be retrieved');
        }
    }
    /**
     * Cache Css asset files and retrieve cached asset files
     *
     * @return array
     */
    protected function cacheCssAssetFiles()
    {
        // Cache media asset files
        $this->cacheMediaAssetFiles();
        if ($this->getOptions()->isProduction()) {
            // Retrieve asset file filters manager
            $oAssetFileFiltersManager = $this->getAssetFileFiltersManager();
            // Retrieve Css file filter if available
            $oCssFileFilter = $oAssetFileFiltersManager->has(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS) ? $oAssetFileFiltersManager->get(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS) : null;
            // Create tmp asset file
            $oTmpAssetFile = $this->createTmpAssetFile(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS);
            // Merge less asset files
            foreach ($this->cacheLessAssetFiles() as $oAssetFile) {
                $oTmpAssetFile->setAssetFileContents($this->rewriteAssetFileUrls(
                    // File content
                    $oCssFileFilter ? $oCssFileFilter->filterAssetFile($oAssetFile) : $oAssetFile->getAssetFileContents(),
                    // Current asset file
                    $oAssetFile
                ). PHP_EOL);
                // Remove temp less asset file
                \Zend\Stdlib\ErrorHandler::start();
                unlink($oAssetFile->getAssetFilePath());
                \Zend\Stdlib\ErrorHandler::stop(true);
            }
            // Merge css asset files
            foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS) as $oAssetFile) {
                $oTmpAssetFile->setAssetFileContents($this->rewriteAssetFileUrls(
                    // File content
                    $oCssFileFilter ? $oCssFileFilter->filterAssetFile($oAssetFile) : $oAssetFile->getAssetFileContents(),
                    // Current asset file
                    $oAssetFile
                ) . PHP_EOL);
            }
             // Cache asset file if not empty
            if($oTmpAssetFile->getAssetFileSize()){
                return array($this->getAssetFilesCacheManager()->cacheAssetFile($oTmpAssetFile));
            }
            return array();
        }
        // Cache less asset files
        $aAssetFiles = $this->cacheLessAssetFiles();
        // Retrieve asset files cache manager
        $oAssetFilesCacheManager = $this->getAssetFilesCacheManager();
        foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS) as $oAssetFile) {
            // Cache asset file if not empty
            if($oAssetFile->getAssetFileSize()){
                $aAssetFiles[] = $oAssetFilesCacheManager->cacheAssetFile($oAssetFile);
            }
        }
        return $aAssetFiles;
    }
    /**
     * Cache Less asset files and retrieve cached asset files
     *
     * @return array
     */
    protected function cacheLessAssetFiles()
    {
        // Create tmp asset file
        $oTmpAssetFile = $this->createTmpAssetFile(\AssetsBundle\AssetFile\AssetFile::ASSET_LESS);
        // Retrieve Asset file cache manager;
        $oAssetFilesCacheManager = $this->getAssetFilesCacheManager();
        // Production don't need to cache less asset file
        if ($this->getOptions()->isProduction()) {
            $oTmpAssetFile->setAssetFileType(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS);
        }
        // Retrieve asset file cached if exists
        if (file_exists($sAssetFileCachedPath = $oAssetFilesCacheManager->getAssetFileCachePath($oTmpAssetFile))) {
            \Zend\Stdlib\ErrorHandler::start();
            $iAssetFileCachedFilemtime = filemtime($sAssetFileCachedPath);
            \Zend\Stdlib\ErrorHandler::stop(true);
        } else {
            $iAssetFileCachedFilemtime = null;
        }
        // Build import less file
        \Zend\Stdlib\ErrorHandler::start();
        $bIsUpdated = !$this->getAssetFilesConfiguration()->assetsConfigurationHasChanged(array(\AssetsBundle\AssetFile\AssetFile::ASSET_LESS));
        foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_LESS) as $oAssetFile) {
            if ($iAssetFileCachedFilemtime && $bIsUpdated) {
                $bIsUpdated = $iAssetFileCachedFilemtime >= $oAssetFile->getAssetFileLastModified();
            }
            // If less asset file is a php file, retrieve its content and add it as final less file content
            if ($oAssetFile->getAssetFileExtension() === 'php') {
                $sLessContent = $oAssetFile->getAssetFileContents();
            }
            // Else import it in final less file
            else {
                $sLessContent = '@import "' . str_replace(array(getcwd(), DIRECTORY_SEPARATOR), array('', '/'), $oAssetFile->getAssetFilePath()) . '";';
            }
            $oTmpAssetFile->setAssetFileContents($sLessContent . PHP_EOL);
        }
        \Zend\Stdlib\ErrorHandler::stop(true);
        // If less file is updated return cached asset file
        if ($iAssetFileCachedFilemtime && $bIsUpdated) {
            return array($oTmpAssetFile->setAssetFilePath($sAssetFileCachedPath)->setAssetFileType(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS));
        }
        // Run less asset file filter
        $sAssetFileFilteredContent = $this->getAssetFileFiltersManager()->get(\AssetsBundle\AssetFile\AssetFile::ASSET_LESS)->filterAssetFile($oTmpAssetFile);
        // Set new content to temp asset file contents
        $oTmpAssetFile->setAssetFileContents($sAssetFileFilteredContent, false);
        // Development need to cache less asset file if not empty
        if($oTmpAssetFile->getAssetFileSize()){
            return array($this->getAssetFilesCacheManager()->cacheAssetFile($oTmpAssetFile)->setAssetFileType(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS));
        }
        return array();
    }
    /**
     * Cache Js asset files and retrieve cached asset files
     *
     * @return array
     */
    protected function cacheJsAssetFiles()
    {
        if ($this->getOptions()->isProduction()) {
            // Retrieve asset file filters manager
            $oAssetFileFiltersManager = $this->getAssetFileFiltersManager();
            // Retrieve Js asset file filter if available
            $oJsFileFilter = $oAssetFileFiltersManager->has(\AssetsBundle\AssetFile\AssetFile::ASSET_JS) ? $oAssetFileFiltersManager->get(\AssetsBundle\AssetFile\AssetFile::ASSET_JS) : null;
            // Create tmp asset file
            $oTmpAssetFile = $this->createTmpAssetFile(\AssetsBundle\AssetFile\AssetFile::ASSET_JS);
            foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_JS) as $oAssetFile) {
                $sAssetFileContent = $oJsFileFilter ? $oJsFileFilter->filterAssetFile($oAssetFile) : $oAssetFile->getAssetFileContents();
                $oTmpAssetFile->setAssetFileContents($sAssetFileContent . PHP_EOL);
            }
            if($oTmpAssetFile->getAssetFileSize()){
                return array($this->getAssetFilesCacheManager()->cacheAssetFile($oTmpAssetFile));
            }
            return array();
        }
        // Retrieve asset files cache manager
        $oAssetFilesCacheManager = $this->getAssetFilesCacheManager();
        $aAssetFiles = array();
        foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_JS) as $oAssetFile) {
            // Cache asset file if not empty
            if($oAssetFile->getAssetFileSize()){
                $aAssetFiles[] = $oAssetFilesCacheManager->cacheAssetFile($oAssetFile);
            }
        }
        return $aAssetFiles;
    }
    /**
     * Cache media asset files and retrieve cached asset files
     *
     * @return array
     */
    protected function cacheMediaAssetFiles()
    {
        $aAssetFileFilters = array();
        $aAssetFiles = array();
        //Retrieve asset files cache manager
        $oAssetFilesCacheManager = $this->getAssetFilesCacheManager();
        // Retrieve asset file filters manager
        $oAssetFileFiltersManager = $this->getAssetFileFiltersManager();
        $bIsProduction = $this->getOptions()->isProduction();
        foreach ($this->getAssetFilesConfiguration()->getAssetFiles(\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA) as $oAssetFile) {
            if ($oAssetFilesCacheManager->isAssetFileCached($oAssetFile)) {
                $aAssetFiles[] = $oAssetFilesCacheManager->getAssetFileCachePath($oAssetFile);
                continue;
            }
            if ($bIsProduction) {
                if (array_key_exists($sAssetFileExtension = $oAssetFile->getAssetFileExtension(), $aAssetFileFilters)) {
                    $oMediaFileFilter = $aAssetFileFilters[$sAssetFileExtension];
                } else {
                    $oMediaFileFilter = $aAssetFileFilters[$sAssetFileExtension] = $oAssetFileFiltersManager->has($sAssetFileExtension) ? $oAssetFileFiltersManager->get($sAssetFileExtension) : null;
                }
            } else {
                $oMediaFileFilter = null;
            }
            if ($oMediaFileFilter) {
                $oTmpAssetFile = $this->createTmpAssetFile(\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA);
                $oTmpAssetFile->setAssetFileContents($oMediaFileFilter->filterAssetFile($oAssetFile), false);
                // Cache asset file
                $aAssetFiles[] = $oAssetFilesCacheManager->cacheAssetFile($oTmpAssetFile, $oAssetFile);
            } else {
                // Cache asset file
                $aAssetFiles[] = $oAssetFilesCacheManager->cacheAssetFile($oAssetFile);
            }
        }
        return $aAssetFiles;
    }
    /**
     * Rewrite url of an asset file content to match with cache path if needed
     * @param string $sAssetFileContent
     * @param \AssetsBundle\AssetFile\AssetFile $oAssetFile
     * @return string
     */
    public function rewriteAssetFileUrls(string $sAssetFileContent, \AssetsBundle\AssetFile\AssetFile $oAssetFile) : string
    {
        // Callback for url rewriting
        $oRewriteUrlCallback = array($this, 'rewriteUrl');
        return preg_replace_callback('/url\(([^\)]+)\)/', function ($aMatches) use ($oAssetFile, $oRewriteUrlCallback) {
            return call_user_func($oRewriteUrlCallback, $aMatches, $oAssetFile);
        }, $sAssetFileContent);
    }
     /**
     * Rewrite url to match with cache path if needed
     *
     * @param array $aMatches
     * @param \AssetsBundle\AssetFile\AssetFile $oAssetFile
     * @return string
     * @throws \InvalidArgumentException
     * @throws \LogicException
     */
    public function rewriteUrl(array $aMatches, \AssetsBundle\AssetFile\AssetFile $oAssetFile): string
    {
        if (!isset($aMatches[1])) {
            throw new \InvalidArgumentException('Url match is not valid');
        }
        // Remove quotes & double quotes from url
        $aFirstCharMatches = null;
        $sFirstChar = preg_match('/^("|\'){1}/', $sUrl = trim($aMatches[1]), $aFirstCharMatches) ? $aFirstCharMatches[1] : '';
        $sUrl = str_ireplace(array('"', '\''), '', $sUrl);
        // Data url
        if (strpos($sUrl, 'data:') === 0) {
            return $aMatches[0];
        }
        // Remote absolute url
        if (preg_match('/^http/', $sUrl)) {
            return $aMatches[0];
        }
        // Split arguments
        if (strpos($sUrl, '?') !== false) {
            list($sUrl, $sArguments) = explode('?', $sUrl);
        }
        // Split anchor
        if (strpos($sUrl, '#') !== false) {
            list($sUrl, $sAnchor) = explode('#', $sUrl);
        }
        // Absolute url
        if (($sUrlRealpath = $this->getOptions()->getRealPath($sUrl, $oAssetFile))) {
            // Initialize asset file from url
            $oUrlAssetFile = new \AssetsBundle\AssetFile\AssetFile(array(
                'asset_file_type' => \AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA,
                'asset_file_path' => $sUrlRealpath
            ));
            $sAssetFileCachePath = $this->getAssetFilesCacheManager()->getAssetFileCachePath($oUrlAssetFile);
            if (!file_exists($sAssetFileCachePath)) {
                throw new \LogicException('Media file "' . $oUrlAssetFile->getAssetFilePath() . '" used by "' . $oAssetFile->getAssetFilePath() . '" does not have been cached. Please add it into ["assets_bundle"]["assets"]["media"] configuration array');
            }
            // Define cached file path
            $oUrlAssetFile->setAssetFilePath($sAssetFileCachePath);
            // Retrieve asset file base url
            $sAssetFileBaseUrl = $this->getOptions()->getAssetFileBaseUrl($oUrlAssetFile);
            // Add argument and / or anchor to asset file base url
            $sAssetFileRealBaseUrl = $sFirstChar . $sAssetFileBaseUrl . (empty($sArguments) ? '' : '?' . $sArguments) . (empty($sAnchor) ? '' : '#' . $sAnchor) . $sFirstChar;
            // Return asset file base url
            return str_replace($aMatches[1], $sAssetFileRealBaseUrl, $aMatches[0]);
        } // Remote relative url
        elseif ($oAssetFile->isAssetFilePathUrl()) {
            return str_replace($aMatches[1], $sFirstChar . dirname($oAssetFile->getAssetFilePath()) . '/' . ltrim($sUrl, '/') . $sFirstChar, $aMatches[0]);
        } // Url is not an exising file
        else {
            throw new \LogicException('Url file "' . $sUrl . '" does not exist even relative with "' . $oAssetFile->getAssetFilePath() . '"');
        }
    }
    /**
     * @param string $sAssetFileType
     * @return \AssetsBundle\AssetFile\AssetFile
     * @throws \InvalidArgumentException
     */
    protected function createTmpAssetFile($sAssetFileType)
    {
        if (!\AssetsBundle\AssetFile\AssetFile::assetFileTypeExists($sAssetFileType)) {
            throw new \InvalidArgumentException('Asset file type "' . $sAssetFileType . '" is not valid');
        }
        // Create tmp asset file
        \Zend\Stdlib\ErrorHandler::start();
        $sTmpAssetFilePath = tempnam($this->getOptions()->getTmpDirPath(), $sAssetFileType . '_' . uniqid());
        \Zend\Stdlib\ErrorHandler::stop(true);
        $this->tmpAssetFilesPathes[] = $sTmpAssetFilePath;
        return new \AssetsBundle\AssetFile\AssetFile(array(
            'asset_file_type' => $sAssetFileType,
            'asset_file_path' => $sTmpAssetFilePath
        ));
    }
    /**
     * @param \AssetsBundle\Service\ServiceOptions $oOptions
     * @return \AssetsBundle\AssetFile\AssetFilesManager
     */
    public function setOptions(\AssetsBundle\Service\ServiceOptions $oOptions)
    {
        $this->options = $oOptions;
        if (isset($this->assetFilesConfiguration)) {
            $this->getAssetFilesConfiguration()->setOptions($this->options);
        }
        if (isset($this->assetFileFiltersManager)) {
            $this->getAssetFileFiltersManager()->setOptions($this->options);
        }
        if (isset($this->assetFilesCacheManager)) {
            $this->getAssetFilesCacheManager()->setOptions($this->options);
        }
        return $this;
    }
    /**
     * @return \AssetsBundle\Service\ServiceOptions
     */
    public function getOptions()
    {
        if (!($this->options instanceof \AssetsBundle\Service\ServiceOptions)) {
            $this->setOptions(new \AssetsBundle\Service\ServiceOptions());
        }
        return $this->options;
    }
    /**
     * Set the asset files configuration
     *
     * @param  \AssetsBundle\AssetFile\AssetFilesConfiguration $oAssetFilesConfiguration
     * @return \AssetsBundle\AssetFile\AssetFilesManager
     */
    public function setAssetFilesConfiguration(\AssetsBundle\AssetFile\AssetFilesConfiguration $oAssetFilesConfiguration)
    {
        $this->assetFilesConfiguration = $oAssetFilesConfiguration->setOptions($this->getOptions());
        return $this;
    }
    /**
     * Retrieve the asset files configuration. Lazy loads an instance if none currently set.
     *
     * @return \AssetsBundle\AssetFile\AssetFilesConfiguration
     */
    public function getAssetFilesConfiguration()
    {
        if (!$this->assetFilesConfiguration instanceof \AssetsBundle\AssetFile\AssetFilesConfiguration) {
            $this->setAssetFilesConfiguration(new \AssetsBundle\AssetFile\AssetFilesConfiguration());
        }
        return $this->assetFilesConfiguration;
    }
    /**
     * Set the asset file filters manager
     *
     * @param  \AssetsBundle\AssetFile\AssetFileFiltersManager $oAssetFileFiltersManager
     * @return \AssetsBundle\AssetFile\AssetFilesManager
     */
    public function setAssetFileFiltersManager(\AssetsBundle\AssetFile\AssetFileFiltersManager $oAssetFileFiltersManager)
    {
        $this->assetFileFiltersManager = $oAssetFileFiltersManager->setOptions($this->getOptions());
        return $this;
    }
    /**
     * Retrieve the asset file filters manager. Lazy loads an instance if none currently set.
     *
     * @return \AssetsBundle\AssetFile\AssetFileFiltersManager
     */
    public function getAssetFileFiltersManager()
    {
        if (!$this->assetFileFiltersManager instanceof \AssetsBundle\AssetFile\AssetFileFiltersManager) {
            $this->setAssetFileFiltersManager(new \AssetsBundle\AssetFile\AssetFileFiltersManager());
        }
        return $this->assetFileFiltersManager;
    }
    /**
     * Set the asset files cache manager
     *
     * @param  \AssetsBundle\AssetFile\AssetFilesCacheManager $oAssetFilesCacheManager
     * @return \AssetsBundle\AssetFile\AssetFilesManager
     */
    public function setAssetFilesCacheManager(\AssetsBundle\AssetFile\AssetFilesCacheManager $oAssetFilesCacheManager)
    {
        $this->assetFilesCacheManager = $oAssetFilesCacheManager->setOptions($this->getOptions());
        return $this;
    }
    /**
     * Retrieve the asset files cache manager. Lazy loads an instance if none currently set.
     *
     * @return \AssetsBundle\AssetFile\AssetFilesCacheManager
     */
    public function getAssetFilesCacheManager()
    {
        if (!$this->assetFilesCacheManager instanceof \AssetsBundle\AssetFile\AssetFilesCacheManager) {
            $this->setAssetFilesCacheManager(new \AssetsBundle\AssetFile\AssetFilesCacheManager());
        }
        return $this->assetFilesCacheManager;
    }
}