Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / vendor / consolidation / config / src / Inject / ConfigForSetters.php
diff --git a/vendor/consolidation/config/src/Inject/ConfigForSetters.php b/vendor/consolidation/config/src/Inject/ConfigForSetters.php
new file mode 100644 (file)
index 0000000..5ec8704
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+namespace Consolidation\Config\Inject;
+
+use Consolidation\Config\Util\ConfigMerge;
+
+/**
+ * Given an object that contains configuration methods, inject any
+ * configuration found in the configuration file.
+ *
+ * The proper use for this method is to call setter methods of the
+ * provided object. Using configuration to call methods that do work
+ * is an abuse of this mechanism.
+ */
+class ConfigForSetters
+{
+    protected $config;
+
+    public function __construct($config, $group, $prefix = '', $postfix = '')
+    {
+        if (!empty($group) && empty($postfix)) {
+            $postfix = '.';
+        }
+
+        $this->config = new ConfigMerge($config, $group, $prefix, $postfix);
+    }
+
+    public function apply($object, $configurationKey)
+    {
+        $settings = $this->config->get($configurationKey);
+        foreach ($settings as $setterMethod => $args) {
+            $fn = [$object, $setterMethod];
+            if (is_callable($fn)) {
+                $result = call_user_func_array($fn, (array)$args);
+
+                // We require that $fn must only be used with setter methods.
+                // Setter methods are required to always return $this so that
+                // they may be chained. We will therefore throw an exception
+                // for any setter that returns something else.
+                if ($result != $object) {
+                    $methodDescription = get_class($object) . "::$setterMethod";
+                    $propertyDescription = $this->config->describe($configurationKey);
+                    throw new \Exception("$methodDescription did not return '\$this' when processing $propertyDescription.");
+                }
+            }
+        }
+    }
+}