code: func (p *Parser) Parse(in []byte, v interface{}) error {
  	var versionedStruct struct {
  		Version Version
  	}
  
  	if err := yaml.Unmarshal(in, &versionedStruct); err != nil {
  		return err
  	}
  
  	parseInfo, ok := p.mapping[versionedStruct.Version]
  	if !ok {
  		return fmt.Errorf("unsupported version: %q", versionedStruct.Version)
  	}
  
  	parseAs := reflect.New(parseInfo.ParseAs)
  	err := yaml.Unmarshal(in, parseAs.Interface())
  	if err != nil {
  		return err
  	}
  
  	for _, envVar := range p.env {
  		pathStr := envVar.name
  		if strings.HasPrefix(pathStr, strings.ToUpper(p.prefix)+"_") {
  			path := strings.Split(pathStr, "_")
  
  			err = p.overwriteFields(parseAs, pathStr, path[1:], envVar.value)
  			if err != nil {
  				return err
  			}
  		}
  	}
  
  	c, err := parseInfo.ConversionFunc(parseAs.Interface())
  	if err != nil {
  		return err
  	}
  	reflect.ValueOf(v).Elem().Set(reflect.Indirect(reflect.ValueOf(c)))
  	return nil
  }
docs: // Parse reads in the given []byte and environment and writes the resulting
  // configuration into the input v
  //
  // Environment variables may be used to override configuration parameters other
  // than version, following the scheme below:
  // v.Abc may be replaced by the value of PREFIX_ABC,
  // v.Abc.Xyz may be replaced by the value of PREFIX_ABC_XYZ, and so forth