/**
   * Sets the value of the mutable interval from the string.
   *
   * @param writableInterval the interval to set
   * @param object the String to convert, must not be null
   * @param chrono the chronology to use, may be null
   */
  public void setInto(ReadWritableInterval writableInterval, Object object, Chronology chrono) {
    String str = (String) object;

    int separator = str.indexOf('/');
    if (separator < 0) {
      throw new IllegalArgumentException("Format requires a '/' separator: " + str);
    }

    String leftStr = str.substring(0, separator);
    if (leftStr.length() <= 0) {
      throw new IllegalArgumentException("Format invalid: " + str);
    }
    String rightStr = str.substring(separator + 1);
    if (rightStr.length() <= 0) {
      throw new IllegalArgumentException("Format invalid: " + str);
    }

    DateTimeFormatter dateTimeParser = ISODateTimeFormat.dateTimeParser();
    dateTimeParser = dateTimeParser.withChronology(chrono);
    PeriodFormatter periodParser = ISOPeriodFormat.standard();
    long startInstant = 0, endInstant = 0;
    Period period = null;
    Chronology parsedChrono = null;

    // before slash
    char c = leftStr.charAt(0);
    if (c == 'P' || c == 'p') {
      period = periodParser.withParseType(getPeriodType(leftStr)).parsePeriod(leftStr);
    } else {
      DateTime start = dateTimeParser.parseDateTime(leftStr);
      startInstant = start.getMillis();
      parsedChrono = start.getChronology();
    }

    // after slash
    c = rightStr.charAt(0);
    if (c == 'P' || c == 'p') {
      if (period != null) {
        throw new IllegalArgumentException("Interval composed of two durations: " + str);
      }
      period = periodParser.withParseType(getPeriodType(rightStr)).parsePeriod(rightStr);
      chrono = (chrono != null ? chrono : parsedChrono);
      endInstant = chrono.add(period, startInstant, 1);
    } else {
      DateTime end = dateTimeParser.parseDateTime(rightStr);
      endInstant = end.getMillis();
      parsedChrono = (parsedChrono != null ? parsedChrono : end.getChronology());
      chrono = (chrono != null ? chrono : parsedChrono);
      if (period != null) {
        startInstant = chrono.add(period, endInstant, -1);
      }
    }

    writableInterval.setInterval(startInstant, endInstant);
    writableInterval.setChronology(chrono);
  }
 /**
  * Extracts duration values from an object of this converter's type, and sets them into the given
  * ReadWritableDuration.
  *
  * @param period period to get modified
  * @param object the String to convert, must not be null
  * @param chrono the chronology to use
  * @return the millisecond duration
  * @throws ClassCastException if the object is invalid
  */
 public void setInto(ReadWritablePeriod period, Object object, Chronology chrono) {
   String str = (String) object;
   PeriodFormatter parser = ISOPeriodFormat.standard();
   period.clear();
   int pos = parser.parseInto(period, str, 0);
   if (pos < str.length()) {
     if (pos < 0) {
       // Parse again to get a better exception thrown.
       parser.withParseType(period.getPeriodType()).parseMutablePeriod(str);
     }
     throw new IllegalArgumentException("Invalid format: \"" + str + '"');
   }
 }