class ReflectionBodyGenerator implements FormUrlEncodedBodyGenerator {

  @Override
  public <T extends KanbaneryResource> String asString(T entity) {
    String resourceId = entity.getResourceId();
    log.info("Preparing form encoded data for: {}", resourceId);

    Collection<Field> fields = getAllFields(entity);
    log.info("{} has {} fields in total.", resourceId, fields.size());

    Collection<Field> fieldsToBeSet = filter(fields, new SettableNotNullFieldsPredicate<T>(entity));
    log.info("{} has {} fields to be set (not null and @Settable)", resourceId, fieldsToBeSet.size());

    Collection<String> fieldsWithValues = transform(fieldsToBeSet, new FieldNameToArrayNotationWithValueFunction<T>(entity));
    log.info("Prepared array notation of data for {}", resourceId);

    return joinDataParts(fieldsWithValues);
  }

  public  ReflectionBodyGenerator();

}