docs: public void wireParams(Object object) {
          Class<?> clazz = object.getClass();
  
          while (clazz != Object.class) {
              for (Field field : clazz.getDeclaredFields()) {
                  field.setAccessible(true);
                  Param annot = field.getAnnotation(Param.class);
  
                  if (annot != null) {
                      String propName = expandPropertyName(annot.property());
                      String value = propertyProvider.getProperty(propName);
                      
                      if (value == null || value.isEmpty()) {
                          value = annot.defaultValue();
                          value = NULL_VALUE.equals(value) ? null : value;
                      }
                      
                      if (value == null) {
                          if (annot.required()) {
                              throw new RuntimeException("Required configuration property not specified: " + propName);
                          } else {
                              continue;
                          }
                      }
  
                      try {
                          field.set(object, conversionService.convert(value, field.getType()));
                      } catch (Exception e) {
                          throw MiscUtil.toUnchecked(e);
                      }
                  }
              }
  
              clazz = clazz.getSuperclass();
          }
      }