vendor/assetic/src/Assetic/Factory/LazyAssetManager.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/assetic/src/Assetic/Factory/LazyAssetManager.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,204 @@
+<?php
+
+/*
+ * This file is part of the Assetic package, an OpenSky project.
+ *
+ * (c) 2010-2011 OpenSky Project Inc
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Assetic\Factory;
+
+use Assetic\AssetManager;
+use Assetic\Factory\Loader\FormulaLoaderInterface;
+use Assetic\Factory\Resource\ResourceInterface;
+
+/**
+ * A lazy asset manager is a composition of a factory and many formula loaders.
+ *
+ * @author Kris Wallsmith <kris.wallsmith@gmail.com>
+ */
+class LazyAssetManager extends AssetManager
+{
+    private $factory;
+    private $loaders;
+    private $resources;
+    private $formulae;
+    private $loaded;
+    private $loading;
+
+    /**
+     * Constructor.
+     *
+     * @param AssetFactory $factory The asset factory
+     * @param array        $loaders An array of loaders indexed by alias
+     */
+    public function __construct(AssetFactory $factory, $loaders = array())
+    {
+        $this->factory = $factory;
+        $this->loaders = array();
+        $this->resources = array();
+        $this->formulae = array();
+        $this->loaded = false;
+        $this->loading = false;
+
+        foreach ($loaders as $alias => $loader) {
+            $this->setLoader($alias, $loader);
+        }
+    }
+
+    /**
+     * Adds a loader to the asset manager.
+     *
+     * @param string                 $alias  An alias for the loader
+     * @param FormulaLoaderInterface $loader A loader
+     */
+    public function setLoader($alias, FormulaLoaderInterface $loader)
+    {
+        $this->loaders[$alias] = $loader;
+        $this->loaded = false;
+    }
+
+    /**
+     * Adds a resource to the asset manager.
+     *
+     * @param ResourceInterface $resource A resource
+     * @param string            $loader   The loader alias for this resource
+     */
+    public function addResource(ResourceInterface $resource, $loader)
+    {
+        $this->resources[$loader][] = $resource;
+        $this->loaded = false;
+    }
+
+    /**
+     * Returns an array of resources.
+     *
+     * @return array An array of resources
+     */
+    public function getResources()
+    {
+        $resources = array();
+        foreach ($this->resources as $r) {
+            $resources = array_merge($resources, $r);
+        }
+
+        return $resources;
+    }
+
+    /**
+     * Checks for an asset formula.
+     *
+     * @param string $name An asset name
+     *
+     * @return Boolean If there is a formula
+     */
+    public function hasFormula($name)
+    {
+        if (!$this->loaded) {
+            $this->load();
+        }
+
+        return isset($this->formulae[$name]);
+    }
+
+    /**
+     * Returns an asset's formula.
+     *
+     * @param string $name An asset name
+     *
+     * @return array The formula
+     *
+     * @throws InvalidArgumentException If there is no formula by that name
+     */
+    public function getFormula($name)
+    {
+        if (!$this->loaded) {
+            $this->load();
+        }
+
+        if (!isset($this->formulae[$name])) {
+            throw new \InvalidArgumentException(sprintf('There is no "%s" formula.', $name));
+        }
+
+        return $this->formulae[$name];
+    }
+
+    /**
+     * Sets a formula on the asset manager.
+     *
+     * @param string $name    An asset name
+     * @param array  $formula A formula
+     */
+    public function setFormula($name, array $formula)
+    {
+        $this->formulae[$name] = $formula;
+    }
+
+    /**
+     * Loads formulae from resources.
+     *
+     * @throws LogicException If a resource has been added to an invalid loader
+     */
+    public function load()
+    {
+        if ($this->loading) {
+            return;
+        }
+
+        if ($diff = array_diff(array_keys($this->resources), array_keys($this->loaders))) {
+            throw new \LogicException('The following loader(s) are not registered: '.implode(', ', $diff));
+        }
+
+        $this->loading = true;
+
+        foreach ($this->resources as $loader => $resources) {
+            foreach ($resources as $resource) {
+                $this->formulae = array_replace($this->formulae, $this->loaders[$loader]->load($resource));
+            }
+        }
+
+        $this->loaded = true;
+        $this->loading = false;
+    }
+
+    public function get($name)
+    {
+        if (!$this->loaded) {
+            $this->load();
+        }
+
+        if (!parent::has($name) && isset($this->formulae[$name])) {
+            list($inputs, $filters, $options) = $this->formulae[$name];
+            $options['name'] = $name;
+            parent::set($name, $this->factory->createAsset($inputs, $filters, $options));
+        }
+
+        return parent::get($name);
+    }
+
+    public function has($name)
+    {
+        if (!$this->loaded) {
+            $this->load();
+        }
+
+        return isset($this->formulae[$name]) || parent::has($name);
+    }
+
+    public function getNames()
+    {
+        if (!$this->loaded) {
+            $this->load();
+        }
+
+        return array_unique(array_merge(parent::getNames(), array_keys($this->formulae)));
+    }
+
+    public function isDebug()
+    {
+        return $this->factory->isDebug();
+    }
+}