code: function patch$1(o, n, doRepaint) {
  	// patch attrs obj
  	if (isPlainObj(n)) {
  		// TODO: re-establish refs
  
  		// shallow-clone target
  		var donor = Object.create(o);
  		// fixate orig attrs
  		donor.attrs = assignObj({}, o.attrs);
  
  		{
  			// prepend any fixed shorthand class
  			if (n.class != null && o._class != null)
  				{ n.class = o._class + " " + n.class; }
  		}
  
  		// assign new attrs into live targ node
  		var oattrs = assignObj(o.attrs, n);
  
  		patchAttrs(o, donor);
  
  		doRepaint && repaint(o);
  	}
  	// patch full vnode
  	else {
  		// no full patching of view roots, just use redraw!
  		if (o.vm != null)
  			{ return; }
  
  		preProc(n, o.parent, o.idx, null);
  		o.parent.body[o.idx] = n;
  		patch(n, o);
  		doRepaint && repaint(n);
  		drainDidHooks(getVm(n), false);
  	}
  }
docs: newNode can be either {class: style: } or full new VNode will/didPatch hooks?