docs: function reset() {
      var data,
          event,
          me = this,
          index = 0,
          changes = { 'length': 0 },
          queue = { 'length': 0 };
  
      if (me.running && !calledBy.abort) {
        // no worries, `reset()` is called within `abort()`
        calledBy.reset = true;
        me.abort();
        delete calledBy.reset;
      }
      else {
        // a non-recursive solution to check if properties have changed
        // http://www.jslab.dk/articles/non.recursive.preorder.traversal.part4
        data = { 'destination': me, 'source': extend({}, me.constructor.prototype, me.options) };
        do {
          forOwn(data.source, function(value, key) {
            var changed,
                destination = data.destination,
                currValue = destination[key];
  
            if (value && typeof value == 'object') {
              if (isClassOf(value, 'Array')) {
                // check if an array value has changed to a non-array value
                if (!isClassOf(currValue, 'Array')) {
                  changed = currValue = [];
                }
                // or has changed its length
                if (currValue.length != value.length) {
                  changed = currValue = currValue.slice(0, value.length);
                  currValue.length = value.length;
                }
              }
              // check if an object has changed to a non-object value
              else if (!currValue || typeof currValue != 'object') {
                changed = currValue = {};
              }
              // register a changed object
              if (changed) {
                changes[changes.length++] = { 'destination': destination, 'key': key, 'value': currValue };
              }
              queue[queue.length++] = { 'destination': currValue, 'source': value };
            }
            // register a changed primitive
            else if (value !== currValue && !(value == null || isClassOf(value, 'Function'))) {
              changes[changes.length++] = { 'destination': destination, 'key': key, 'value': value };
            }
          });
        }
        while ((data = queue[index++]));
  
        // if changed emit the `reset` event and if it isn't cancelled reset the benchmark
        if (changes.length && (me.emit(event = Event('reset')), !event.cancelled)) {
          forEach(changes, function(data) {
            data.destination[data.key] = data.value;
          });
        }
      }
      return me;
    }