code: @NullSafe
    @SuppressWarnings("all")
    public static HashCodeBuilder hashCodeFor(Object obj) {
      HashCodeBuilder builder = create();
  
      Optional.ofNullable(obj).ifPresent(object -> {
        withFields().on(object).matching(field -> !ModifierUtils.isTransient(field)).call(field -> {
          getLogger().fine(() -> FormatUtils.format("Hashing field [%1$s] on object [%2$s]",
            field.getName(), object.getClass().getName()));
  
          builder.with(getValue(object, field, field.getType()));
        });
      });
  
      return builder;
    }
docs: Factory method to construct a new instance of {@link HashCodeBuilder} used to compute the hash code
  of the given {@link Object}.
  
  This factory method can used to implement a {@code hashCode()} method for any object by simply
  overriding the {@link Object#hashCode()} method on your class type and implementing as follows...
  
  <code>
  &#64;Override
  public int hashCode() {
  return HashCodeBuilder.hashCodeFor(this).build();
  }
  </code>
  
  @param obj {@link Object} on which to compute the hash code.
  @return an instance of {@link HashCodeBuilder} used to compute the hash code of the given {@link Object}.
  @see java.lang.Object#hashCode()