code: function like(a, b) {
    if (a.type === 'var' && b.type === 'vars') {
      if (b.nodes.length === 1) {
        b = b.nodes[0];
      }
    }
    // allow wildcards
    if (b.type === 'name' &&
         (b.value === ('__' + a.type + '__') || b.value === '__any__')) {
      return true;
    }
    if (a.type !== b.type) {
      return false;
    }
    if (a.value !== b.value) {
      // if (b.type === 'name' && b.value === '__name__') {
      //   return true;
      // }
      return false;
    }
    if (isValueNode(a) !== isValueNode(b)) {
      return false;
    }
    if (!isValueNode(a)) {
      if (a.nodes.length < b.nodes.length) {
        return false;
      }
      for (var i = 0; i < b.nodes.length; i++) {
        if (!like(a.nodes[i], b.nodes[i])) {
          return false;
        }
      }
    }
    return true;
  }
docs: /*
  Determine if a node is "like" another node, meaning it has all the properties of
  that node.
  @param {AstNode|Object} a Node to test for comparison. Must have all the
  properties of node b.
  @param {AstNode|Object} b Node that has a partial set of node a's properties.