docs: function defineEvent( moduleObject, moduleOption ) {
  
          /**
           * define all event functions on your own object
           * 
           * @module EventJS
           * 
           * @tutorial  {@link http://opencrisp.wca.at/tutorials/EventJS_test.html}
           * @tutorial  {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#options}
           *
           * @see  use option.ns={@link util.event} with {@link module:BaseJS.utilCreate}
           *
           * @example
           * var myObject = {};
           * 
           * Crisp.defineEvent( myObject );
           * 
           * myObject.eventListener({
           *     listen: function( e ) {
           *         assert.strictEqual( myObject, this );
           *         assert.strictEqual( myObject, e.self );
           *     }
           * });
           * 
           * myObject.eventTrigger();
           */
  
          // moduleOption = moduleOption || {};
          // moduleOption.event = moduleOption.event || defaultOptionEvent;
          // moduleOption.parent = moduleOption.parent || defaultOptionParent;
          moduleOption = defaultOption( moduleOption );
  
          /**
           * @property {util.event.Event}
           * @name module:EventJS#__event__
           *
           * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#__event__}
           *
           * @example
           * var myObject = {};
           * Crisp.defineEvent( myObject, { event: '__myevent__' });
           */
          Object.defineProperty( moduleObject, moduleOption.event, { writabel: true, value: new Event() });
  
          /**
           * @abstract
           * @property {module:EventJS} 
           * @name  module:EventJS#__parent__
           * 
           * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#__parent__}
           *
           * @example
           * var myObject = {};
           * Crisp.defineEvent( myObject, { parent: '__myparent__' });
           */
          
  
  
  
          Object.defineProperties( moduleObject, {
  
              /**
               * @function
               * @param {external:Object}                 option
               * @param {util.utilTickCallback}           option.listen
               * @param {external:Object}                 [option.self={@link module:EventJS|EventJS}]
               * @param {external:Boolean}                [option.async=false]
               * 
               * @param {util.event.optionFilter}         [option.action]
               * @param {util.event.optionFilter}         [option.path]
               * 
               * @param {external:String}                 [option.noteList={@link util.event.defaultNoteList|defaultNoteList}] use on eventPicker
               * @param {util.event.optionFilter}         [option.noteAction] use on eventPicker
               * @param {util.event.optionFilter}         [option.notePath] use on eventPicker
               *
               * @this module:EventJS
               * @return {util.event.EventListener}
               *
               * @memberOf module:EventJS
               *
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#eventListener|eventListener}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#option-self|eventListener option.self}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#eventtrigger-option-self|eventListener eventTrigger option.self}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#option-self-eventtrigger-option-self|eventListener option.self eventTrigger option.self}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#option-async|eventListener option.async}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#action-string|eventListener option.action String}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#action-namespace|eventListener option.action Namespace}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#action-regexp|eventListener option.action RegExp}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#path-string|eventListener option.path String}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#path-regexp|eventListener option.path RegExp}
               *
               * @example
               * var myObject = {};
               * 
               * Crisp.defineEvent( myObject );
               * 
               * myObject.eventListener({
               *   listen: function( e ) {}
               * });
               */
              eventListener: {
                  value: function ( option ) {
                      return eventListener.call( this, option, this[ moduleOption.event ] );
                  }
              },
  
              /**
               * @function
               * @param {external:Object}  [option]
               * @param {external:Boolean} [option.repeat=false]
               * @param {external:Object}  [option.exporter]      ignore the eventListener function if eventListener(option.self) is the same as eventTrigger(option.exporter) 
               * 
               * @param {external:String}  [option.action]
               * @param {external:String}  [option.path]
               * 
               * @param {AnyItem}          [option.args]          alternate arguments for apply the eventListener function
               *
               * @this module:EventJS
               * @return {module:EventJS}
               *
               * @memberOf module:EventJS
               *
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#eventTrigger}
               *
               * @example
               * var myObject = {};
               * 
               * Crisp.defineEvent( myObject );
               * 
               * myObject.eventListener({
               *   listen: function( e ) {}
               * });
               *
               * myObject.eventTrigger();
               */
              eventTrigger: {
                  value: function ( option ) {
                      return eventTrigger.call( this, option, this[ moduleOption.event ], this[ moduleOption.parent ] );
                  }
              },
  
              /**
               * @function
               * @param {external:Object} option
               * @param {external:Object} option.cache
               * @param {external:String} [option.action={@link util.event.defaultPickerAction}]
               * @param {external:String} [option.path]
               * @param {external:Boolean} [option.empty] execute event when nodelist is empty 
               *
               * @this module:EventJS
               * @return {util.event.EventPicker}
               *
               * @memberOf module:EventJS
               *
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#eventpicker|eventPicker}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#option-action|eventPicker option.action}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#option-path|eventPicker option.path}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#multi-note|eventPicker multi note}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#eventlistener-filter-path|eventPicker eventListener filter path}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#eventlistener-filter-notepath|eventPicker eventListener filter notePath}
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS-picker_test.html#eventlistener-filter-noteaction|eventPicker eventListener filter noteAction}
               *
               * @example
               * var myObject = {};
               * var pickerCache = {};
               * 
               * Crisp.defineEvent( myObject );
               * 
               * myObject.eventListener({
               *   listen: function( e ) {
               *     console.log('action:', e.action );
               *     console.log('list:', JSON.stringify( e._note ) );
               *   }
               * });
               * 
               * var picker = myObject.eventPicker({
               *   cache: pickerCache
               * });
               * 
               * picker.Note({
               *   action: 'update'
               * });
               * 
               * picker.Talk();
               * 
               * // logs:
               * // action: 'task'
               * // list: '{"list":{"own":[{"action":"update"}]}}'
               */
              eventPicker: {
                  value: eventPicker
              },
  
              /**
               * @function
               * @param {util.event.EventListener} eventObject
               * 
               * @this module:EventJS
               * @return {module:EventJS}
               *
               * @memberOf module:EventJS
               * 
               * @tutorial {@link http://opencrisp.wca.at/tutorials/EventJS_test.html#eventRemove}
               *
               * @example
               * var myObject = {};
               * 
               * Crisp.defineEvent( myObject );
               * 
               * var eventObject = myObject.eventListener({
               *   listen: function( e ) {}
               * });
               *
               * myObject.eventRemove( eventObject );
               */
              eventRemove: {
                  value: function ( eventObject ) {
                      return eventRemove.call( this, eventObject, this[ moduleOption.event ] );
                  }
              },
  
  
              eventResettle: {
                  value: function ( parentObject ) {
                      return eventResettle.call( this, parentObject, this[ moduleOption.event ] );
                  }
              }
  
          });
  
          return moduleObject;
      }