ngModule.run(function($rootScope) {
    var proto = $rootScope.constructor.prototype;
    var $emit = proto.$emit;
    var $broadcast = proto.$broadcast;

    proto.$emit = function(name, args) {
        //(a:b:c)-> [] (a) => [a] (b) => [a, a:b] (c) => [a, a:b, a:b:c]
        var event = $emit.call(this, name, args);
        var cascade = name.split(':').slice(0,-1).join(':');
        event.cascade = cascade && !event.stopCascade ?
                this.$emit(cascade+'*', args) : false;
        return event;
    }

    proto.$broadcast = function(name, args) {
        //(a:b:c)-> [] (a) => [a] (b) => [a, a:b] (c) => [a, a:b, a:b:c]
        var event = $broadcast.call(this, name, args);
        var cascade = name.split(':').slice(0,-1).join(':');
        event.cascade = cascade && !event.stopCascade ?
                this.$broadcast(cascade+'*', args) : false;
        return event;
    }
});