code: function (container, property, callback, throwError, recursive) {
  
                  // backward compatibility support -> new parameter has been introduced after container.
                  if (typeUtils.isObject(property)) {
                      return this.addListener(container, null, property, callback, throwError);
                  }
  
                  // choose the appropriate meta name depending on the type
                  var meta = __getListenerMetaName(property, recursive);
                  if (!__isValidContainer(container)) {
                      if (throwError) {
                          throw {
                              code : this.NOT_OF_SPECIFIED_DH_TYPE
                          };
                      } else {
                          this.$logError(this.NOT_OF_SPECIFIED_DH_TYPE, null, container);
                      }
                      return;
                  }
  
                  if (!container[meta]) {
                      container[meta] = [callback];
                  } else {
                      // check if not already in the list
                      var listeners = container[meta];
                      if (arrayUtils.indexOf(listeners, callback) > -1) {
                          return; // already in the array
                      }
                      listeners.push(callback);
                  }
                  if (recursive) {
                      this.__checkBackRefs(container);
                  }
              }
docs: Adds a listener to an object. The listener is a standard callback which is called when data are modified
  through setValue. <strong>Note that callback parameter cannot be a function - see the note below</strong>.
  @param {Object} container reference to the data holder object - e.g. data.search.preferedCity
  @param {String} property name of a given property in the targeted container. If specified, the callback
  will be called only if this property is changed.
  @param {aria.core.CfgBeans:Callback} callback listener callback to add. <strong>Note that
  JsObject.$callback is not used for performance reasons, so that only the form { fn : {Function}, scope:
  {Object}, args : {MultiTypes}} is supported for this callback.</strong>
  @param {Boolean} throwError if true, throws errors instead of logging it.
  @param {Boolean} recursive If true, the listener will also be called for changes in the whole sub-tree of
  the container. If false, it will be called only for changes in the container itself.