summaryrefslogtreecommitdiff
path: root/vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php')
-rw-r--r--vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php89
1 files changed, 89 insertions, 0 deletions
diff --git a/vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php b/vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php
new file mode 100644
index 0000000..c561a3d
--- /dev/null
+++ b/vendor/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace Guzzle\Service\Builder;
+
+use Guzzle\Service\AbstractConfigLoader;
+use Guzzle\Service\Exception\ServiceNotFoundException;
+
+/**
+ * Service builder config loader
+ */
+class ServiceBuilderLoader extends AbstractConfigLoader
+{
+ protected function build($config, array $options)
+ {
+ // A service builder class can be specified in the class field
+ $class = !empty($config['class']) ? $config['class'] : __NAMESPACE__ . '\\ServiceBuilder';
+
+ // Account for old style configs that do not have a services array
+ $services = isset($config['services']) ? $config['services'] : $config;
+
+ // Validate the configuration and handle extensions
+ foreach ($services as $name => &$service) {
+
+ $service['params'] = isset($service['params']) ? $service['params'] : array();
+
+ // Check if this client builder extends another client
+ if (!empty($service['extends'])) {
+
+ // Make sure that the service it's extending has been defined
+ if (!isset($services[$service['extends']])) {
+ throw new ServiceNotFoundException(
+ "{$name} is trying to extend a non-existent service: {$service['extends']}"
+ );
+ }
+
+ $extended = &$services[$service['extends']];
+
+ // Use the correct class attribute
+ if (empty($service['class'])) {
+ $service['class'] = isset($extended['class']) ? $extended['class'] : '';
+ }
+ if ($extendsParams = isset($extended['params']) ? $extended['params'] : false) {
+ $service['params'] = $service['params'] + $extendsParams;
+ }
+ }
+
+ // Overwrite default values with global parameter values
+ if (!empty($options)) {
+ $service['params'] = $options + $service['params'];
+ }
+
+ $service['class'] = isset($service['class']) ? $service['class'] : '';
+ }
+
+ return new $class($services);
+ }
+
+ protected function mergeData(array $a, array $b)
+ {
+ $result = $b + $a;
+
+ // Merge services using a recursive union of arrays
+ if (isset($a['services']) && $b['services']) {
+
+ // Get a union of the services of the two arrays
+ $result['services'] = $b['services'] + $a['services'];
+
+ // Merge each service in using a union of the two arrays
+ foreach ($result['services'] as $name => &$service) {
+
+ // By default, services completely override a previously defined service unless it extends itself
+ if (isset($a['services'][$name]['extends'])
+ && isset($b['services'][$name]['extends'])
+ && $b['services'][$name]['extends'] == $name
+ ) {
+ $service += $a['services'][$name];
+ // Use the `extends` attribute of the parent
+ $service['extends'] = $a['services'][$name]['extends'];
+ // Merge parameters using a union if both have parameters
+ if (isset($a['services'][$name]['params'])) {
+ $service['params'] += $a['services'][$name]['params'];
+ }
+ }
+ }
+ }
+
+ return $result;
+ }
+}