/**
   * Replaces or adds a service. The replacement is based on the service class.
   *
   * @param newService The new service to set.
   */
  public synchronized void set(Service newService) {
    List<Service> services = new CopyOnWriteArrayList<Service>();
    Service service;
    boolean replaced = false;

    for (int i = 0; (i < size()); i++) {
      service = get(i);

      if (service != null) {
        if (service.getClass().isAssignableFrom(newService.getClass())) {
          try {
            service.stop();
          } catch (Exception e) {
            Context.getCurrentLogger().log(Level.WARNING, "Unable to stop service replaced", e);
          }

          services.add(newService);
          replaced = true;
        } else {
          services.add(service);
        }
      }
    }

    if (!replaced) {
      services.add(newService);
    }

    set(services);
  }
  /**
   * Returns a service matching a given service class.
   *
   * @param <T> The service type.
   * @param clazz The service class to match.
   * @return The matched service instance.
   */
  @SuppressWarnings("unchecked")
  public <T extends Service> T get(Class<T> clazz) {
    for (Service service : this) {
      if (clazz.isAssignableFrom(service.getClass())) {
        return (T) service;
      }
    }

    return null;
  }