/**
  * @param ConfigInterface $config
  *
  * @return DirectiveInterface
  * @throws Exception
  */
 public function mergeInto(ConfigInterface $config) : DirectiveInterface
 {
     $identifier = sprintf('%s.%s', static::class, $this->identifier);
     // only set directive if it is not present
     if ($config->lacks($identifier)) {
         $config->set($identifier, $this->getValue());
         return $this;
     }
     $mergePolicy = $this->mergePolicy;
     // automatically define the merge policy depending
     // on current directive value
     //
     // - MERGE arrays
     // - REPLACE other types
     if ($mergePolicy == MergePolicy::AUTO) {
         if (is_array($config->get($identifier))) {
             $mergePolicy = MergePolicy::NATIVE;
         } else {
             $mergePolicy = MergePolicy::REPLACE;
         }
     }
     // otherwise handle MergePolicy
     switch ($mergePolicy) {
         case MergePolicy::SKIP:
             break;
         case MergePolicy::REPLACE:
             $config->set($identifier, $this->getValue());
             break;
         case MergePolicy::NATIVE:
             $combinedValue = array_merge((array) $config->get($identifier), (array) $this->value);
             $config->set($identifier, $combinedValue);
             break;
         case MergePolicy::COMBINE:
         case MergePolicy::RECURSIVE:
             $combinedValue = array_merge_recursive((array) $config->get($identifier), (array) $this->value);
             $config->set($identifier, $combinedValue);
             break;
         default:
             throw new Exception(sprintf('Unsupported merge policy "%s"', $this->mergePolicy));
     }
     return $this;
 }