Observe pattern

by Anton Kolesnikov

JavaScript

var publisher = {
    
    subscribers : {
        any: []
    },
    
    subscribe: function(fn, type){
        var type = type || 'any';
        if( typeof this.subscribers[type] === 'undefined') {
            this.subscribers[type] = [];
        }
        this.subscribers[type].push(fn);
    },
    
    unsubscribe: function(fn, type) {
        this.visitSubscribers('unsubscribe', fn, type);
    },
    
    publish: function(publication, type){
        this.visitSubscribers('publish', publication, type);
    },
    
    visitSubscribers: function(action, arg, type){
        var type = type || 'any',
            i,
            max = this.subscribers[type].length;
        for (i=0; i<max; i++){
            if( action === 'publish'){
                subscribers[i](arg);
            } else {
                if( subscribers[i] === arg) subscribers.splice(i,1);
            }
        }; // for
    }
}