code: function visitNode(callback, node, last) {
      	if(typeof callback.visitNode === 'function') {
  	        node.parent = last;
  	        var ret = callback.visitNode(node);
  	        if(ret === Visitor.BREAK || ret === Visitor.SKIP) {
  	            return ret;
  	        } 
  	        if(Array.isArray(node.attributes)) {
  	            var attr;
  	            for(var i = 0, len = node.attributes.length; i < len; i++) {
  	                attr = node.attributes[i];
  	                attr.parent = node;
  	                ret = callback.visitNode(attr);
  	                if(typeof callback.endVisitNode === 'function') {
  			    		callback.endVisitNode(attr);
  			    	}
  	                if(ret === Visitor.SKIP) {
  	                    break;
  	                } else if(ret === Visitor.BREAK) {
  	                    return ret;
  	                }
  	            }
  	        }
  	        var kids = node.children;
  	        if(kids) {
  	            for(i = 0; i < kids.length; i++) {
  	                ret = visitNode(callback, kids[i], node);
  	                if(typeof callback.endVisitNode === 'function') {
  			    		callback.endVisitNode(kids[i]);
  			    	}
  	                if(ret === Visitor.BREAK) {
  	                    return ret;
  	                } else if(ret === Visitor.SKIP) {
  	                    continue;
  	                }
  	            }
  	        }
          }
      }
docs: Visits a given node with a given callback function. if the function does not implement #visitNode this function does nothing
  @param {Function} callback The visitor callback. Can optionally implement #visitNode
  @param {Object} node The current node being visited
  @param {Object} last the last node that was visited
  @returns {Number} Returns #Break or #SKIP or nothing