The source code

    /**
     * @ignore
     *  utils for event
     * @author yiminghe@gmail.com
     */
    KISSY.add('event/base/utils', function (S) {

        var getTypedGroups, splitAndRun;

        return {

            splitAndRun: splitAndRun = function (type, fn) {
                type = S.trim(type);
                if (type.indexOf(' ') == -1) {
                    fn(type);
                } else {
                    S.each(type.split(/\s+/), fn);
                }
            },

            normalizeParam: function (type, fn, context) {
                var cfg = fn || {};

                if (S.isFunction(fn)) {
                    cfg = {
                        fn: fn,
                        context: context
                    };
                } else {
                    // copy
                    cfg = S.merge(cfg);
                }

                var typedGroups = getTypedGroups(type);

                type = typedGroups[0];

                cfg.groups = typedGroups[1];

                cfg.type = type;

                return cfg;
            },

            batchForType: function (fn, num) {
                var args = S.makeArray(arguments),
                    types = args[2 + num];
                splitAndRun(types, function (type) {
                    var args2 = [].concat(args);
                    args2.splice(0, 2);
                    args2[num] = type;
                    fn.apply(null, args2);
                });
            },

            getTypedGroups: getTypedGroups = function (type) {
                if (type.indexOf('.') < 0) {
                    return [type, ''];
                }
                var m = type.match(/([^.]+)?(\..+)?$/),
                    t = m[1],
                    ret = [t],
                    gs = m[2];
                if (gs) {
                    gs = gs.split('.').sort();
                    ret.push(gs.join('.'));
                } else {
                    ret.push('');
                }
                return ret;
            },

            getGroupsRe: function (groups) {
                return new RegExp(groups.split('.').join('.*\\.') + '(?:\\.|$)');
            }

        };

    });