Source: Events/Ancestor.js

define('Events/Ancestor',[
  './namespace',
  'InternalObject',
  'utils/createChildNamespace'
],function (Events,
            InternalObject,
            createChildNamespace) {
  /**
   * @namespace Ancestor
   * @memberOf BeautifulProperties.Events
   */
  var Ancestor = createChildNamespace(Events,'Ancestor');
  var namespace = 'Events.Ancestor';
  /**
   * @callback BeautifulProperties.Events.Ancestor~ancestorRetriever
   * @param {object} object target object
   * @param {BeautifulProperties.Events.Event} event
   * @returns {object|null|undefined}
   * @description The function to retrieve the ancestor of given object.
   */
  /**
   *
   * @function setRetriever
   * @memberOf BeautifulProperties.Events.Ancestor
   * @param {object} object target object
   * @param {BeautifulProperties.Events.Ancestor~ancestorRetriever} ancestorRetriever
   */
  Ancestor.setRetriever = function set(object,ancestorRetriever){
    InternalObject.register(object,namespace,ancestorRetriever);
  };
  /**
   *
   * @function retrieve
   * @memberOf BeautifulProperties.Events.Ancestor
   * @param {object} object target object
   * @param {BeautifulProperties.Events.Event}
   * @returns {object|null} the ancestor of the target object
   * @description Retrieve the ancestor of the target object by the ancestorRetriever that set on the target object.
   * If the target object don't have ancestorRetriever or the ancestorRetriever returns undefined,
   * the method returns the prototype of the target object.
   */
  Ancestor.retrieve = function retrieve(object,event) {
    var retriever = InternalObject.retrieve(namespace,false,object);
    var ancestor;
    if (retriever) {
      ancestor = retriever(object,event);
    }
    if (ancestor === undefined) {
      ancestor = Object.getPrototypeOf(object);
    }
    return ancestor;
  };
  return Ancestor;
});