docs: function on(elem, type, fn) {
    if (Array.isArray(type)) {
      return _handleMultipleEvents(on, elem, type, fn);
    }
  
    var data = Dom.getElData(elem);
  
    // We need a place to store all our handler data
    if (!data.handlers) {
      data.handlers = {};
    }
  
    if (!data.handlers[type]) {
      data.handlers[type] = [];
    }
  
    if (!fn.guid) {
      fn.guid = Guid.newGUID();
    }
  
    data.handlers[type].push(fn);
  
    if (!data.dispatcher) {
      data.disabled = false;
  
      data.dispatcher = function (event, hash) {
  
        if (data.disabled) {
          return;
        }
  
        event = fixEvent(event);
  
        var handlers = data.handlers[event.type];
  
        if (handlers) {
          // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
          var handlersCopy = handlers.slice(0);
  
          for (var m = 0, n = handlersCopy.length; m < n; m++) {
            if (event.isImmediatePropagationStopped()) {
              break;
            } else {
              try {
                handlersCopy[m].call(elem, event, hash);
              } catch (e) {
                _log2['default'].error(e);
              }
            }
          }
        }
      };
    }
  
    if (data.handlers[type].length === 1) {
      if (elem.addEventListener) {
        elem.addEventListener(type, data.dispatcher, false);
      } else if (elem.attachEvent) {
        elem.attachEvent('on' + type, data.dispatcher);
      }
    }
  }