lib/route/visitors/create_visitor.js
function createVisitor(handlers) {
  nodeTypes.forEach(function (nodeType) {
    if (typeof handlers[nodeType] === 'undefined') {
      throw new Error('No handler defined for ' + nodeType.displayName);
    }
  });

  return {
    /**
     * Call the given handler for this node type
     * @param  {Object} node    the AST node
     * @param  {Object} context context to pass through to handlers
     * @return {Object}
     */
    visit: function (node, context) {
      return this.handlers[node.displayName].call(this, node, context);
    },
    handlers: handlers
  };
}
function createVisitor(handlers) {
  nodeTypes.forEach(function (nodeType) {
    if (typeof handlers[nodeType] === 'undefined') {
      throw new Error('No handler defined for ' + nodeType.displayName);
    }
  });

  return {
    /**
     * Call the given handler for this node type
     * @param  {Object} node    the AST node
     * @param  {Object} context context to pass through to handlers
     * @return {Object}
     */
    visit: function (node, context) {
      return this.handlers[node.displayName].call(this, node, context);
    },
    handlers: handlers
  };
}
Helper for creating visitors. Take an object of node name to handler
mappings, returns an object with a "visit" method that can be called
@param  {Object.<string,function(node,context)>} handlers A mapping of node
type to visitor functions
@return {{visit: function(node,context)}}  A visitor object with a "visit"
method that can be called on a node with a context