code: function contains(ast, fn, descendOn) {
          if (!ast) 
              return null;
          if (fn && typeof fn === 'object') {
              var keys = Object.keys(fn);
              return contains(ast, function (node) {
                  return keys.every(function (k) {
                      return node[k] == fn[k];
                  });
              });
          }
          var n, found = {};
          if (Array.isArray(ast)) {
              for (var i = 0;i < ast.length; i++) 
                  if (n = contains(ast[i], fn)) 
                  return n;
              return null;
          }
          var subScopes = descendOn;
          if (typeof descendOn !== "function") {
              if (descendOn) {
                  subScopes = function (n) {
                      return true;
                  };
              } else {
                  subScopes = function (n) {
                      return !examine(n).isScope;
                  };
              }
          }
          try {
              treeWalk(ast, function (node, descend, path) {
                  if (fn(node)) {
                      found.path = path;
                      throw found;
                  }
                  if (node === ast || subScopes(node)) 
                      descend();
              });
          } catch (ex) {
              if (ex === found) 
                  return found.path;
              throw ex;
          }
          return null;
      }
docs: /*
  descendOn = true                     Enter scopes within scopes
  descendOn = false/undefined/null     Do not enter scopes within scopes
  descendOn = function                 Descend when function(node) is true