public <Context, Result> @NonNull ServicePipeline registerServiceType(
            final @NonNull TypeToken<? extends Service<@NonNull Context, @NonNull Result>> type,
            final @NonNull Service<@NonNull Context, @NonNull Result> defaultImplementation
    ) {
        synchronized (this.lock) {
            if (this.repositories.containsKey(type.getType())) {
                throw new IllegalArgumentException(String
                        .format(
                                "Service of type '%s' has already been registered",
                                type.getType().getTypeName()
                        ));
            }
            final ServiceRepository<Context, Result> repository = new ServiceRepository<>(type);
            repository.registerImplementation(defaultImplementation, Collections.emptyList());
            this.repositories.put(type.getType(), repository);
            return this;
        }
    }
Register a service type so that it is recognized by the pipeline

@param type                  Service type
@param defaultImplementation Default implementation of the service. This must *always* be
                             supplied and will be the last service implementation that the
                             pipeline attempts to access. This will never be filtered out.
@param <Context>             Service context type
@param <Result>              Service result type
@return ServicePipeline The service pipeline instance
cloud-services/src/main/java/org/incendo/cloud/services/ServicePipeline.java