code: public <T extends Builder<? extends MessageSender>> T sender(Class<T> builderClass) {
  		return senderBuilderHelper.register(builderClass);
  	}
docs: Registers and configures sender through a dedicated builder.
  
  For example:
  
  <pre>
  .sender(CloudhopperBuilder.class)
  .host("localhost");
  </pre>
  
  <p>
  If your custom builder is annotated by one or several of:
  <ul>
  <li>{@link RequiredClass}</li>
  <li>{@link RequiredProperty}</li>
  <li>{@link RequiredClasses}</li>
  <li>{@link RequiredProperties}</li>
  </ul>
  Then if condition evaluation returns true, your built implementation will
  be used. If you provide several annotations, your built implementation
  will be used only if all conditions are met (and operator).
  
  <p>
  If your custom builder implements {@link ActivableAtRuntime}, and the
  provided condition evaluation returns true, then your built
  implementation will be used.
  
  See {@link MessageConditions} to build your condition.
  </p>
  
  <p>
  If neither annotations nor implementation of {@link ActivableAtRuntime}
  is used, then your built implementation will be always used. All other
  implementations (even standard ones) will never be used.
  </p>
  
  <p>
  In order to be able to keep chaining, you builder instance may provide a
  constructor with one argument with the type of the parent builder
  ({@link SmsBuilder}). If you don't care about chaining, just provide a
  default constructor.
  </p>
  
  <p>
  Your builder may return {@code null} when calling
  {@link Builder#build()}. In this case it means that your implementation
  can't be used due to current environment. Your implementation is then not
  registered.
  </p>
  
  @param builderClass
  the builder class to instantiate
  @param <T>
  the type of the builder
  @return the builder to configure the implementation