module.exports = function(obj) {

    var events = {};
    var slice = [].slice;


    // Infinite handlers support:
    // obj.on = function(event) {
    //     var handlers = slice.call(arguments, 1);
    //     for (var i = 0, handler; (handler = handlers[i]); ++i) {
    //         (events[event] = events[event] || []).push(handler);
    //     }
    //     return obj;
    // };

    obj.on = function(event, handler) {
        (events[event] = events[event] || []).push(handler);
        return obj;
    };


    obj.once = function(event, handler) {
        return obj.on(event, function onceWrapper() {
            handler.apply(null, arguments);
            obj.off(event, onceWrapper);
        });
    };


    obj.emit = function(event) {
        var i, handler;
        var args = slice.call(arguments, 1);
        var handlers = [];

        // emit sub:events
        var parts = event.split(':');
        for (i = 1; i <= parts.length; i++) {
            var subHandlers = events[parts.slice(0, i).join(':')];
            if (subHandlers) handlers = handlers.concat(subHandlers);
        }

        // NOTE: doesn't log names for once listeners
        // DEBUG
        console.log('EVENT: ', event, ' => ',
            handlers.map(function(f) {
                return f.name;
            }).join(', ') || 'nothing to do ...'
        );

        for (i = 0, handler; (handler = handlers[i]); ++i) {
            handler.apply(null, args);
        }

        return obj;
    };


    // remove specific handler or remove all handlers
    obj.off = function(event, handler) {
        if (handler) {
            var handlers = events[event];
            var i = handlers.indexOf(handler);
            if (i >= 0) handlers.splice(i, 1);
        } else {
            events[event] = [];
        }

        return obj;
    };


    // obj.stop = function(event, handler) {

    //     if (event === "*") {
    //         events = {};
    //     } else if (handler) {
    //         var arr = events[event];
    //         for (var i = 0, cb; (cb = arr && arr[i]); ++i) {
    //             if (cb === handler) {
    //                 arr.splice(i, 1); i--;
    //             }
    //         }
    //     } else {
    //         event.replace(/\S+/g, function(name) {
    //             events[name] = [];
    //         });
    //     }
    //     return obj;
    // };



    return obj;
};

@@ -79,1031 +79,277 @@
 e;%0A%0A
-%0A    // Infinite handlers support:%0A    // obj.on = function(event) %7B%0A    //     var handlers = slice.call(arguments, 1);%0A    //     for (var i = 0, handler; (handler = handlers%5Bi%5D); ++i) %7B%0A    //         (events%5Bevent%5D = events%5Bevent%5D %7C%7C %5B%5D).push(handler);%0A    //     %7D%0A    //     return obj;%0A    // %7D;%0A%0A    obj.on = function(event, handler) %7B%0A        (events%5Bevent%5D = events%5Bevent%5D %7C%7C %5B%5D).push(handler);%0A        return obj;%0A    %7D;%0A%0A%0A    obj.once = function(event, handler) %7B%0A        return obj.on(event, function onceWrapper() %7B%0A            handler.apply(null, arguments);%0A            obj.off(event, onceWrapper);%0A        %7D);%0A    %7D;%0A%0A%0A    obj.emit = function(event) %7B%0A        var i, handler;%0A        var args = slice.call(arguments, 1);%0A        var handlers = %5B%5D;%0A%0A        // emit sub:events%0A        var parts = event.split(':');%0A        for (i = 1; i %3C= parts.length; i++) %7B%0A            var subHandlers = events%5Bparts.slice(0, i).join(':')%5D;%0A            if (subHandlers) handlers = handlers.concat(subHandlers);%0A        %7D
+    obj.on = function(event, handler) %7B%0A        (events%5Bevent%5D = events%5Bevent%5D %7C%7C %5B%5D).push(handler);%0A        return obj;%0A    %7D;%0A%0A%0A    obj.emit = function(event) %7B%0A        var i, handler;%0A        var args = slice.call(arguments, 1);%0A        var handlers = events%5Bevent%5D;
 %0A%0A  
@@ -1081,556 +1081,8 @@
 ;%0A%0A%0A
-    // obj.stop = function(event, handler) %7B%0A%0A    //     if (event === %22*%22) %7B%0A    //         events = %7B%7D;%0A    //     %7D else if (handler) %7B%0A    //         var arr = events%5Bevent%5D;%0A    //         for (var i = 0, cb; (cb = arr && arr%5Bi%5D); ++i) %7B%0A    //             if (cb === handler) %7B%0A    //                 arr.splice(i, 1); i--;%0A    //             %7D%0A    //         %7D%0A    //     %7D else %7B%0A    //         event.replace(/%5CS+/g, function(name) %7B%0A    //             events%5Bname%5D = %5B%5D;%0A    //         %7D);%0A    //     %7D%0A    //     return obj;%0A    // %7D;%0A%0A%0A%0A
     

simplify eventEmiter