code: function updateDataIs(expr, parent, tagName) {
    var conf, isVirtual, head, ref;
  
    if (expr.tag && expr.tagName === tagName) {
      expr.tag.update();
      return
    }
  
    isVirtual = expr.dom.tagName === 'VIRTUAL';
    // sync _parent to accommodate changing tagnames
    if (expr.tag) {
      // need placeholder before unmount
      if(isVirtual) {
        head = expr.tag.__.head;
        ref = createDOMPlaceholder();
        head.parentNode.insertBefore(ref, head);
      }
  
      expr.tag.unmount(true);
    }
  
    if (!isString(tagName)) { return }
  
    expr.impl = __TAG_IMPL[tagName];
    conf = {root: expr.dom, parent: parent, hasImpl: true, tagName: tagName};
    expr.tag = initChildTag(expr.impl, conf, expr.dom.innerHTML, parent);
    each(expr.attrs, function (a) { return setAttr(expr.tag.root, a.name, a.value); });
    expr.tagName = tagName;
    expr.tag.mount();
    if (isVirtual)
      { makeReplaceVirtual(expr.tag, ref || expr.tag.root); } // root exist first time, after use placeholder
  
    // parent is the placeholder tag, not the dynamic tag so clean up
    parent.__.onUnmount = function() {
      var delName = expr.tag.opts.dataIs,
        tags = expr.tag.parent.tags,
        _tags = expr.tag.__.parent.tags;
      arrayishRemove(tags, delName, expr.tag);
      arrayishRemove(_tags, delName, expr.tag);
      expr.tag.unmount();
    };
  }
docs: Update dynamically created data-is tags with changing expressions
  @param { Object } expr - expression tag and expression info
  @param { Tag }    parent - parent for tag creation
  @param { String } tagName - tag implementation we want to use