code: public <I extends Request, O extends Response> Client<I, O> decorate(
              Class<I> requestType, Class<O> responseType, Client<I, O> client) {
  
          for (Entry<?, ?> e : entries) {
              if (!requestType.isAssignableFrom(e.requestType()) ||
                  !responseType.isAssignableFrom(e.responseType())) {
                  continue;
              }
  
              @SuppressWarnings("unchecked")
              final Function<Client<I, O>, Client<I, O>> decorator = ((Entry<I, O>) e).decorator();
              client = decorator.apply(client);
          }
  
          return client;
      }
docs: Decorates the specified {@link Client} using the decorator with matching {@code requestType} and
  {@code responseType}.
  
  @param requestType the type of the {@link Request} the specified {@link Client} accepts
  @param responseType the type of the {@link Response} the specified {@link Client} produces
  @param client the {@link Client} being decorated
  @param <I> {@code requestType}
  @param <O> {@code responseType}