protected function runServiceProvisioner(ServiceDefinitionInterface $service_definition, array $settings) { $provisioner_config = $service_definition->getProvisioner(); if (!$provisioner_config) { throw new RuntimeError('Missing provisioner meta-data (at least "class" plus optional a "method" and some "settings").'); } if (!class_exists($provisioner_config['class'])) { throw new RuntimeError('Unable to load provisioner class: ' . $provisioner_config['class']); } $provisioner = $this->di_container->make($provisioner_config['class']); $provisioner_method = $provisioner_config['method']; $provisioner_callable = [$provisioner, $provisioner_method]; if (isset($provisioner_config['settings']) && is_array($provisioner_config['settings'])) { $settings = array_merge($provisioner_config['settings'], $settings); } $provisioner_settings = new Settings($settings); if (!empty($provisioner_method) && is_callable($provisioner_callable)) { $provisioner->{$provisioner_method}($service_definition, $provisioner_settings); } elseif ($provisioner instanceof ProvisionerInterface) { $provisioner->build($service_definition, $provisioner_settings); } else { throw new RuntimeError(sprintf("Provisioner needs <method> configuration or must implement %s", ProvisionerInterface::CLASS)); } }