text: 'use strict';
  
  var events = require('events');
  var util = require('util');
  
  /**
   * The bus represents a connection to node, decoupled from the transport layer, that can
   * listen and subscribe to any events that are exposed by available services. Services
   * can expose events that can be subscribed to by implementing a `getPublishEvents` method.
   * @param {Object} params
   * @param {Node} params.node - A reference to the node
   */
  function Bus(params) {
    events.EventEmitter.call(this);
    this.node = params.node;
    this.remoteAddress = params.remoteAddress;
  }
  
  util.inherits(Bus, events.EventEmitter);
  
  /**
   * This function will find the service that exposes the event by name and
   * call the associated subscribe method with the arguments excluding the
   * first argument of this function.
   * @param {String} name - The name of the event
   */
  Bus.prototype.subscribe = function(name) {
    var events = [];
    for(var i in this.node.services) {
      var service = this.node.services[i];
      events = events.concat(service.getPublishEvents());
    }
  
    for (var j = 0; j < events.length; j++) {
      var event = events[j];
      var params = Array.prototype.slice.call(arguments).slice(1);
      params.unshift(this);
      if (name === event.name) {
        event.subscribe.apply(event.scope, params);
      }
    }
  };
  
  /**
   * The inverse of the subscribe method.
   * @param {String} name - The name of the event
   */
  Bus.prototype.unsubscribe = function(name) {
    var events = [];
    for(var i in this.node.services) {
      var service = this.node.services[i];
      events = events.concat(service.getPublishEvents());
    }
  
    for (var j = 0; j < events.length; j++) {
      var event = events[j];
      var params = Array.prototype.slice.call(arguments).slice(1);
      params.unshift(this);
      if (name === event.name) {
        event.unsubscribe.apply(event.scope, params);
      }
    }
  };
  
  /**
   * This function will unsubscribe all events.
   */
  Bus.prototype.close = function() {
    var events = [];
  
    for(var i in this.node.services) {
      var service = this.node.services[i];
      events = events.concat(service.getPublishEvents());
    }
  
    // Unsubscribe from all events
    for (var j = 0; j < events.length; j++) {
      var event = events[j];
      event.unsubscribe.call(event.scope, this);
    }
  };
  
  module.exports = Bus;
  