code: function updateOpts(isLoop, parent, isAnonymous, opts, instAttrs) {
        // isAnonymous `each` tags treat `dom` and `root` differently. In this case
        // (and only this case) we don't need to do updateOpts, because the regular parse
        // will update those attrs. Plus, isAnonymous tags don't need opts anyway
        if (isLoop && isAnonymous) { return }
        var ctx = isLoop ? inheritParentProps.call(this) : parent || this;
  
        each(instAttrs, function (attr) {
          if (attr.expr) { updateExpression.call(ctx, attr.expr); }
          // normalize the attribute names
          opts[toCamel(attr.name).replace(ATTRS_PREFIX, '')] = attr.expr ? attr.expr.value : attr.value;
        });
      }
docs: We need to update opts for this tag. That requires updating the expressions
  in any attributes on the tag, and then copying the result onto opts.
  @this Tag
  @param   {Boolean} isLoop - is it a loop tag?
  @param   { Tag }  parent - parent tag node
  @param   { Boolean }  isAnonymous - is it a tag without any impl? (a tag not registered)
  @param   { Object }  opts - tag options
  @param   { Array }  instAttrs - tag attributes array