docs: function (element, event, callback, scope, args, useCapture) {
                  if (this._isValidCollection(element)) {
                      var ok = true;
                      for (var i = 0, len = element.length; i < len; ++i) {
                          ok = this._addListener(element[i], event, callback, scope, args, useCapture) && ok;
                      }
                      return ok;
                  }
  
                  if (this.typesUtil.isString(element)) {
                      var oElement = Aria.$window.document.getElementById(element);
                      if (!oElement) {
                          this.$logError(this.INVALID_TARGET, [element, event]);
                          element = oElement;
  
                          return false;
                      }
  
                      element = oElement;
                  }
  
                  if (!this.typesUtil.isHTMLElement(element)) {
                      // Element should be an html element
                      return false;
                  }
  
                  var handler = callback;
                  if (!callback.$Callback) {
                      if (!handler.fn || !this.typesUtil.isFunction(handler.fn)) {
                          return false;
                      }
                      if (!handler.scope) {
                          handler.scope = element;
                      }
                      // callback = new aria.utils.Callback(handler);
                  }
                  var handlerCBInstance = callback;
                  if (!callback.$Callback) {
                      handlerCBInstance = new ariaUtilsCallback(handler);
                  }
  
                  // wrap the function so we can return the obj object
                  // when
                  // the event fires;
  
                  var wrappedCallback;
                  if (event != "mousemove" || !ariaCoreBrowser.isWebkit) {
                      wrappedCallback = function (e) {
                          // only if the event is safetap is used (so aria.touch.ClickBuster is loaded, not null),
                          // click, mousedown or touchend, it is analised in order to avoid ghost click's side effects
                          if ((e.type != "click" && e.type != "mousedown" && e.type != "touchend")
                                  || !aria.touch || !aria.touch.ClickBuster || aria.touch.ClickBuster.preventGhostClick(e)) {
                              return handlerCBInstance.call(aria.utils.Event.getEvent(e, element));
                          }
                      };
                  } else {
  
                      /*
                       * This case has been created to workaround a webkit issue : a click trigger a click and a mousemove
                       * So here we keep the last mouse position, and run the registered callbacks only if the position changed
                       * See http://code.google.com/p/chromium/issues/detail?id=161464
                       */
  
                      var mousePosition = null;
                      wrappedCallback = function (e) {
  
                          e = aria.utils.Event.getEvent(e, element);
  
                          var pageX = e.pageX;
                          var pageY = e.pageY;
                          var touchPositions = "";
                          if (e.touches) {
                              for (var i = 0; i < e.touches.length; i += 1) {
                                  touchPositions += e.touches[i].pageX + "." + e.touches[i].pageY + "|";
                              }
                          }
  
                          if (mousePosition && mousePosition.x === pageX && mousePosition.y === pageY) {
                              // Apparently the mouse didn't move
                              if (!touchPositions || touchPositions === mousePosition.touches) {
                                  // not a touch or a touch in which none of the position changed
                                  return;
                              }
                              // else one of the touches has a different position, go on
                          }
  
                          mousePosition = {
                              x : pageX,
                              y : pageY,
                              touches : touchPositions
                          };
  
                          return handlerCBInstance.call(e);
                      };
                  }
  
                  var cleanCallback = function () {
                      handlerCBInstance = {
                          call : Aria.empty
                      };
                      wrappedCallback = null;
                      cleanCallback = null;
                      li = null;
                      element = null;
                  };
                  var li = [element, event, callback, wrappedCallback, useCapture, handlerCBInstance, cleanCallback];
  
                  // we need to make sure we fire registered unload events
                  // prior to automatically unhooking them. So we hang on
                  // to
                  // these instead of attaching them to the window and
                  // fire the
                  // handles explicitly during our one unload event.
                  if ("unload" == event && args !== this) {
                      this._checkUnloadListeners();
                      unloadListeners[unloadListeners.length] = li;
                      return true;
                  }
  
                  var index = listeners.length;
                  // cache the listener so we can try to automatically
                  // unload
                  listeners[index] = li;
  
                  try {
                      this._simpleAdd(element, event, wrappedCallback, useCapture);
                  } catch (ex) {
                      this.$logError(this.INVALID_TARGET, [element, event], ex);
                      // Clean up the cache
                      this.removeListener(element, event, callback);
                      return false;
                  }
  
                  return true;
              }