ging/social_stream

View on GitHub
base/app/assets/javascripts/social_stream/callback.js

Summary

Maintainability
A
2 hrs
Test Coverage
/* API:
 *
 * SS.Foo = (function(SS) {
 *   var callback = new SS.Callback();
 *
 *   var bar = function(options) {
 *   };
 *
 *   callback.register('index', bar);
 *
 *   return callback.extend({});
 * })();
 *
 * SS.Foo.callbackRegister('show', function() {});
 */
SocialStream.Callback = function() {
  this.registry = {};
  this.handlers = {};
};

SocialStream.Callback.prototype = (function(SS, $, undefined) {
  var register = function() {
    var callback = this,
        funcs    = Array.prototype.slice.call(arguments),
        name     = funcs.shift();

    if (this.registry[name] === undefined) {
      this.registry[name] = [];

      this.handlers[name] = function(options) {
        $.each(callback.registry[name], function(i, f) {
          f(options);
        });
      };
    }

    this.registry[name].push.apply(this.registry[name], funcs);
  };

  var extend = function(obj) {
    var callback = this;

    // Create current handlers
    for (var c in callback.handlers) {
      if (callback.handlers.hasOwnProperty(c)) {
        obj[c] = callback.handlers[c];
      }
    }

    obj.callbackRegister = function() {
      var args = Array.prototype.slice.call(arguments),
          name = args.shift();

      callback.register.apply(callback, arguments);

      // Add future handlers
      if (this[name] === undefined) {
        this[name] = callback.handlers[name];
      }
    };

    return obj;
  };

  return {
    extend: extend,
    register: register
  };
})(SocialStream, jQuery);