docs: function Cipher(config) {
  
    /* config:
        namespace
        nid - node id, integer representing a node within the same namespace (e.g. web1, web2...)
        logger - winston instance
        log - function containing a custom call to the logger
        poolSize
        redis
          host
          port
          options
    */
  
  	// Make sure we have a valid config object
  	this._config = config = (config || {});
  	  
  	// A pool of clients for outgoing requests
  	this._outgoingClientPool = []
  
  	// All clients listening to pub-sub channels
  	this._subscribeClientPool = [];
  
  	// All clients waiting via the BLPOP/BRPOP commands, namespaced by route name
  	this._queueClientPools = {};
  
  	// Auth to use if new clients are added
  	this._auth = config.auth || {};
  
  	// Connection config
  	this._connection = config.connection || {}
  
  	// Namespace to prefix on all message routes
  	if(!config.namespace) {throw Error("No namespace provided!");}
  	else {this._namespace = config.namespace}
  
  	// Random id for node addressing
  	//this._nid = Math.floor(Math.random()*9999999999);
  	//this._nid = config.nid ? config.nid : Math.floor(Math.random()*9999999999); // allowing nid to be configured
  	this._nid = config.nid ? config.nid : 0; // allowing nid to be configured with a default of 0
  
  	// Logging
    // allow the winston instance to be passed to cipher
  	if(!config.logger) {  
      this._logger = new (Winston.Logger) ({ });
      this._logger.add(Winston.transports.Console);
  	} else {
      this._logger = config.logger;
    }
    // allow the log function to be passed to cipher
  	if(!config.log) { 
      this._log = function (message, attr) {
        this._logger.log(attr.level, message, attr);
      }
    } else {
      this._log = config.log;
    }
  
  	// Ensure there is a pool size (not that it means anything right now...)
  	config.poolSize = (config.poolSize || 1);
  
  	// Provision clients in the outgoing client pools
  	var poolSize = config.poolSize;
  	do {
  		this.addToPool(this._outgoingClientPool);
  	} while(--poolSize);
  	
  	// Provision clients for the pub/sub subscription
  	poolSize = config.poolSize;
  	do {
  		var subClient = this.addToPool(this._subscribeClientPool);
  
  		subClient.PSUBSCRIBE(this._namespace.concat(".*"))
  		subClient.on("pmessage", this.recvSubMsg.bind(this));
  	} while(--poolSize);
  
  	// Add the two base queue listeners - REALLY NEED TO CLEAN THIS UP
  	this.addQueueListeners([this._namespace, "*"].join("."));
  	this.addQueueListeners([this._namespace, this._nid].join("."));
  
  	// Transmit route handlers
  	this._transmitHandlers = {};
  
  	// Broadcast route handlers
  	this._broadcastHandlers = {};
  
  	// Log the address
  	//console.log("Cipher is running at %s.%d", this._namespace, this._nid);
    this.log_info("Cipher is running at " + this._namespace + "." + this._nid, {});
  }