code: func (p *Parser) overwriteFields(v reflect.Value, fullpath string, path []string, payload string) error {
  	for v.Kind() == reflect.Ptr {
  		if v.IsNil() {
  			panic("encountered nil pointer while handling environment variable " + fullpath)
  		}
  		v = reflect.Indirect(v)
  	}
  	switch v.Kind() {
  	case reflect.Struct:
  		return p.overwriteStruct(v, fullpath, path, payload)
  	case reflect.Map:
  		return p.overwriteMap(v, fullpath, path, payload)
  	case reflect.Interface:
  		if v.NumMethod() == 0 {
  			if !v.IsNil() {
  				return p.overwriteFields(v.Elem(), fullpath, path, payload)
  			}
  			// Interface was empty; create an implicit map
  			var template map[string]interface{}
  			wrappedV := reflect.MakeMap(reflect.TypeOf(template))
  			v.Set(wrappedV)
  			return p.overwriteMap(wrappedV, fullpath, path, payload)
  		}
  	}
  	return nil
  }
docs: // overwriteFields replaces configuration values with alternate values specified
  // through the environment. Precondition: an empty path slice must never be
  // passed in.