code: @Override
      public void add(final S service)
      {
          if(service == null)
          {
              throw new NullPointerException("Service must not be null");
          }
          
          final K key = this.getKey(service);
          
          if(key == null)
          {
              throw new NullPointerException("Key for service must not be null");
          }
          
          Collection<S> set = this.services.get(key);
          
          set.add(service);
          
          if(set.size() != 1)
          {
              this.log.error("Failing due to a duplicate service with key: {} for class {}", key, service);
              throw new ServiceConfigurationError("Found a duplicate service with key: " + key + " for class: " + service);
          }
          
          if(this.log.isDebugEnabled())
          {
              this.log.debug("Added service with key: {}", key);
          }
      }
docs: Extends the contract for the {@link AbstractServiceLoader#add(Object)} method to require that
  services have unique keys.
  
  @throws ServiceConfigurationError
  If another service is defined with the same key as the service to be added.