class LocalDateUtils {

  static LocalDate plusDays(LocalDate date, int daysToAdd) {
    if (daysToAdd == 0) {
      return date;
    }
    // add the days to the current day-of-month
    // if it is guaranteed to be in this month or the next month then fast path it
    // (59th Jan is 28th Feb, 59th Feb is 31st Mar)
    long dom = date.getDayOfMonth() + daysToAdd;
    if (dom > 0 && dom <= 59) {
      int monthLen = date.lengthOfMonth();
      int month = date.getMonthValue();
      int year = date.getYear();
      if (dom <= monthLen) {
        return LocalDate.of(year, month, (int) dom);
      } else if (month < 12) {
        return LocalDate.of(year, month + 1, (int) (dom - monthLen));
      } else {
        return LocalDate.of(year + 1, 1, (int) (dom - monthLen));
      }
    }
    long mjDay = Math.addExact(date.toEpochDay(), daysToAdd);
    return LocalDate.ofEpochDay(mjDay);
  }

  private  LocalDateUtils();

}