code: function (type, eventData) {
              var self = this, ret, targets = self.getTargets(), hasTargets = targets && targets.length;
              if (type.isEventObject) {
                  eventData = type;
                  type = type.type;
              }
              eventData = eventData || {};
              splitAndRun(type, function (type) {
                  var r2, customEventObservable;
                  Utils.fillGroupsForEvent(type, eventData);
                  type = eventData.type;    // default bubble true
                                            // if bubble false, it must has customEvent structure set already
                  // default bubble true
                  // if bubble false, it must has customEvent structure set already
                  customEventObservable = self.getCustomEventObservable(type);    // optimize performance for empty event listener
                  // optimize performance for empty event listener
                  if (!customEventObservable && !hasTargets) {
                      return;
                  }
                  if (customEventObservable) {
                      if (!customEventObservable.hasObserver() && !customEventObservable.defaultFn) {
                          if (customEventObservable.bubbles && !hasTargets || !customEventObservable.bubbles) {
                              return;
                          }
                      }
                  } else {
                      // in case no publish custom event but we need bubble
                      // because bubbles defaults to true!
                      customEventObservable = new CustomEventObservable({
                          currentTarget: self,
                          type: type
                      });
                  }
                  r2 = customEventObservable.fire(eventData);
                  if (ret !== false && r2 !== undefined) {
                      ret = r2;
                  }
              });
              return ret;
          }
docs: Fire a custom event by name.
  The callback functions will be executed from the context specified when the event was created,
  and the {@link KISSY.Event.CustomEvent.Object} created will be mixed with eventData
  @method fire
  @param {String} type The type of the event
  @param {Object} [eventData] The data will be mixed with {@link KISSY.Event.CustomEvent.Object} created
  @return {*} If any listen returns false, then the returned value is false. else return the last listener's returned value