//
// Event dispatch library
//
// (C) 2006,2007 Atlas Ltd. Some rights reserved.
//
var Dispatcher = Class.create();
Dispatcher.prototype = {

    initialize: function () {
        this.callbacks_ = new Array();
    },

    register: function(object) {
        object.dispatcher = this;
        this.callbacks_.push(object);
        if (object.register_dispatchers) {
            object.register_dispatchers(this);
        }
    },

    unregister: function(func) {
        this.callbacks_ = this.callbacks_.without(func);
    },
    
    send: function() {
        var args = Array.from(arguments);
        var fn = 'on_' + args.shift();
        this.callbacks_.each(function(callback, index) {
            Dispatcher.call_by_name(callback, fn, args);
            if (callback.forwarders) {
                fwds = callback.forwarders;
                fwds.each(function(forwarder) {
                    Dispatcher.call_by_name(forwarder, fn, args);
                });
            }
        });
    }
    
}

Dispatcher.call_by_name = function(callback, name, args) {
    if (callback[name]) {
        return callback[name].apply(callback, args);
    }
    return null;
}
