code: func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
  	if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) {
  		return out, false, false
  	}
  	again := true
  	for again {
  		again = false
  		if out.Kind() == reflect.Ptr {
  			if out.IsNil() {
  				out.Set(reflect.New(out.Type().Elem()))
  			}
  			out = out.Elem()
  			again = true
  		}
  		if out.CanAddr() {
  			if u, ok := out.Addr().Interface().(Unmarshaler); ok {
  				good = d.callUnmarshaler(n, u)
  				return out, true, good
  			}
  		}
  	}
  	return out, false, false
  }
docs: // d.prepare initializes and dereferences pointers and calls UnmarshalYAML
  // if a value is found to implement it.
  // It returns the initialized and dereferenced out value, whether
  // unmarshalling was already done by UnmarshalYAML, and if so whether
  // its types unmarshalled appropriately.
  //
  // If n holds a null value, prepare returns before doing anything.