Edit in JSFiddle

SS = {
 
    re: {
         signal: /SIGNAL_(.*)/
        ,slot: /SLOT_(.*)/
    }
    
    ,setup: function(target){
       
        function fireSetup(sigName){ return function(){
            console.log('told to fire signal: ' + sigName, arguments);
           
            if(this._listeners[sigName])
            for(var i = 0; i < this._listeners[sigName].length; i++){
                this._listeners[sigName][i].apply(this, arguments);
            }
        } }
        
        var i, result, name;
        
        target._listeners = {};
        
        for(i in target){
            if(!target.hasOwnProperty(i)) continue;
                
            result = i.match(SS.re.signal);
            
            if(result !== null){
                // found a signal
                name = result[1];
                
                console.log('found signal', name);
                
                target['_' + name] = fireSetup(name);
                target[name] = name;
                if(!target._listeners[name]) target._listeners[name] = [];
                
                delete target[i];
            }
            
            result = i.match(SS.re.slot);
            
            if(result !== null){
                // found a slot
                name = result[1];
                
                console.log('found slot', name);
                
                // remove SLOT_ prefix
                target[name] = target[i];
                delete target[i];
            }
        }
        
        // setup helper methods
        for(i in this){
            if(this.hasOwnProperty(i) && i !== 'setup'){
                target[i] = this[i];      
            }
        }
        
        console.log('target after setup', target);
        
        return target;
    }
               
               
    ,connect: function(signal, slot){
        if(typeof slot !== 'function') throw new Error('Slot must be a function');
        if(typeof(this['_' + signal]) !== 'function') throw new Error('Signal not found: ' + signal);
                
        if(!this._listeners) this._listeners = {};
        if(!this._listeners[signal]) this._listeners[signal] = [];
        
        this._listeners[signal].push(slot);
    }
    ,disconnect: function(){}
    //,emit: function(sig){}
};

        
        
        
        (function(exports){
            
            function MyObj(){}
            MyObj.prototype = {
                
                SLOT_refresh: function refresh(data){ console.log('told to refresh'); }
                
                ,SIGNAL_ready: 1
                ,SIGNAL_data: 1
                ,SIGNAL_die: 1
                
                ,doSomethingAsync: function(){
                    var self = this;
                    setTimeout(function(){
                        self._data('behold! i am data!', 'so am i');
                    }, 1000);
                }    
                
            };
            
            
            SS.setup(MyObj.prototype);
            window.MyObj = MyObj;
            
        })(window);

        var my = new MyObj();
        var myToo = new MyObj();
        my.doSomethingAsync();
        my.connect(my.data, myToo.refresh);
        console.log(my, MyObj, MyObj.prototype);