code: function(options) {
        var start = ICAL.helpers.formatClassType(options.dtstart, ICAL.Time);
  
        if (!start) {
          throw new Error('.dtstart (ICAL.Time) must be given');
        } else {
          this.dtstart = start;
        }
  
        if (options.component) {
          this._init(options.component);
        } else {
          this.last = formatTime(options.last) || start.clone();
  
          if (!options.ruleIterators) {
            throw new Error('.ruleIterators or .component must be given');
          }
  
          this.ruleIterators = options.ruleIterators.map(function(item) {
            return ICAL.helpers.formatClassType(item, ICAL.RecurIterator);
          });
  
          this.ruleDateInc = options.ruleDateInc;
          this.exDateInc = options.exDateInc;
  
          if (options.ruleDates) {
            this.ruleDates = options.ruleDates.map(formatTime);
            this.ruleDate = this.ruleDates[this.ruleDateInc];
          }
  
          if (options.exDates) {
            this.exDates = options.exDates.map(formatTime);
            this.exDate = this.exDates[this.exDateInc];
          }
  
          if (typeof(options.complete) !== 'undefined') {
            this.complete = options.complete;
          }
        }
      }
docs: Initialize the recurrence expansion from the data object. The options
  object may also contain additional members, see the
  {@link ICAL.RecurExpansion constructor} for more details.
  
  @param {Object} options
  Recurrence expansion options
  @param {ICAL.Time} options.dtstart
  Start time of the event
  @param {ICAL.Component=} options.component
  Component for expansion, required if not resuming.