code: @Override
      public LocalDate with(TemporalAdjuster adjuster) {
          // optimizations
          if (adjuster instanceof LocalDate) {
              return (LocalDate) adjuster;
          }
          return (LocalDate) adjuster.adjustInto(this);
      }
docs: Returns an adjusted copy of this date.
  <p>
  This returns a {@code LocalDate}, based on this one, with the date adjusted.
  The adjustment takes place using the specified adjuster strategy object.
  Read the documentation of the adjuster to understand what adjustment will be made.
  <p>
  A simple adjuster might simply set the one of the fields, such as the year field.
  A more complex adjuster might set the date to the last day of the month.
  <p>
  A selection of common adjustments is provided in
  {@link java.time.temporal.TemporalAdjusters TemporalAdjusters}.
  These include finding the "last day of the month" and "next Wednesday".
  Key date-time classes also implement the {@code TemporalAdjuster} interface,
  such as {@link Month} and {@link java.time.MonthDay MonthDay}.
  The adjuster is responsible for handling special cases, such as the varying
  lengths of month and leap years.
  <p>
  For example this code returns a date on the last day of July:
  <pre>
  import static java.time.Month.*;
  import static java.time.temporal.TemporalAdjusters.*;
  
  result = localDate.with(JULY).with(lastDayOfMonth());
  </pre>
  <p>
  The result of this method is obtained by invoking the
  {@link TemporalAdjuster#adjustInto(Temporal)} method on the
  specified adjuster passing {@code this} as the argument.
  <p>
  This instance is immutable and unaffected by this method call.
  
  @param adjuster the adjuster to use, not null
  @return a {@code LocalDate} based on {@code this} with the adjustment made, not null
  @throws DateTimeException if the adjustment cannot be made
  @throws ArithmeticException if numeric overflow occurs