summaryrefslogtreecommitdiffstats
path: root/3rdparty/Pimple/Pimple.php
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/Pimple/Pimple.php')
-rw-r--r--3rdparty/Pimple/Pimple.php202
1 files changed, 202 insertions, 0 deletions
diff --git a/3rdparty/Pimple/Pimple.php b/3rdparty/Pimple/Pimple.php
new file mode 100644
index 000000000..cb1acd5e0
--- /dev/null
+++ b/3rdparty/Pimple/Pimple.php
@@ -0,0 +1,202 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * Pimple main class.
+ *
+ * @package pimple
+ * @author Fabien Potencier
+ */
+class Pimple implements ArrayAccess
+{
+ private $values;
+
+ /**
+ * Instantiate the container.
+ *
+ * Objects and parameters can be passed as argument to the constructor.
+ *
+ * @param array $values The parameters or objects.
+ */
+ public function __construct (array $values = array())
+ {
+ $this->values = $values;
+ }
+
+ /**
+ * Sets a parameter or an object.
+ *
+ * Objects must be defined as Closures.
+ *
+ * Allowing any PHP callable leads to difficult to debug problems
+ * as function names (strings) are callable (creating a function with
+ * the same a name as an existing parameter would break your container).
+ *
+ * @param string $id The unique identifier for the parameter or object
+ * @param mixed $value The value of the parameter or a closure to defined an object
+ */
+ public function offsetSet($id, $value)
+ {
+ $this->values[$id] = $value;
+ }
+
+ /**
+ * Gets a parameter or an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ *
+ * @return mixed The value of the parameter or an object
+ *
+ * @throws InvalidArgumentException if the identifier is not defined
+ */
+ public function offsetGet($id)
+ {
+ if (!array_key_exists($id, $this->values)) {
+ throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
+ }
+
+ $isFactory = is_object($this->values[$id]) && method_exists($this->values[$id], '__invoke');
+
+ return $isFactory ? $this->values[$id]($this) : $this->values[$id];
+ }
+
+ /**
+ * Checks if a parameter or an object is set.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ *
+ * @return Boolean
+ */
+ public function offsetExists($id)
+ {
+ return array_key_exists($id, $this->values);
+ }
+
+ /**
+ * Unsets a parameter or an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ */
+ public function offsetUnset($id)
+ {
+ unset($this->values[$id]);
+ }
+
+ /**
+ * Returns a closure that stores the result of the given closure for
+ * uniqueness in the scope of this instance of Pimple.
+ *
+ * @param Closure $callable A closure to wrap for uniqueness
+ *
+ * @return Closure The wrapped closure
+ */
+ public function share(Closure $callable)
+ {
+ return function ($c) use ($callable) {
+ static $object;
+
+ if (null === $object) {
+ $object = $callable($c);
+ }
+
+ return $object;
+ };
+ }
+
+ /**
+ * Protects a callable from being interpreted as a service.
+ *
+ * This is useful when you want to store a callable as a parameter.
+ *
+ * @param Closure $callable A closure to protect from being evaluated
+ *
+ * @return Closure The protected closure
+ */
+ public function protect(Closure $callable)
+ {
+ return function ($c) use ($callable) {
+ return $callable;
+ };
+ }
+
+ /**
+ * Gets a parameter or the closure defining an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ *
+ * @return mixed The value of the parameter or the closure defining an object
+ *
+ * @throws InvalidArgumentException if the identifier is not defined
+ */
+ public function raw($id)
+ {
+ if (!array_key_exists($id, $this->values)) {
+ throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
+ }
+
+ return $this->values[$id];
+ }
+
+ /**
+ * Extends an object definition.
+ *
+ * Useful when you want to extend an existing object definition,
+ * without necessarily loading that object.
+ *
+ * @param string $id The unique identifier for the object
+ * @param Closure $callable A closure to extend the original
+ *
+ * @return Closure The wrapped closure
+ *
+ * @throws InvalidArgumentException if the identifier is not defined
+ */
+ public function extend($id, Closure $callable)
+ {
+ if (!array_key_exists($id, $this->values)) {
+ throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
+ }
+
+ $factory = $this->values[$id];
+
+ if (!($factory instanceof Closure)) {
+ throw new InvalidArgumentException(sprintf('Identifier "%s" does not contain an object definition.', $id));
+ }
+
+ return $this->values[$id] = function ($c) use ($callable, $factory) {
+ return $callable($factory($c), $c);
+ };
+ }
+
+ /**
+ * Returns all defined value names.
+ *
+ * @return array An array of value names
+ */
+ public function keys()
+ {
+ return array_keys($this->values);
+ }
+}