code: func readObjectField(
  	r FieldReader,
  	addr []string,
  	schema map[string]*Schema) (FieldReadResult, error) {
  	result := make(map[string]interface{})
  	exists := false
  	for field, s := range schema {
  		addrRead := make([]string, len(addr), len(addr)+1)
  		copy(addrRead, addr)
  		addrRead = append(addrRead, field)
  		rawResult, err := r.ReadField(addrRead)
  		if err != nil {
  			return FieldReadResult{}, err
  		}
  		if rawResult.Exists {
  			exists = true
  		}
  
  		result[field] = rawResult.ValueOrZero(s)
  	}
  
  	return FieldReadResult{
  		Value:  result,
  		Exists: exists,
  	}, nil
  }
docs: // readObjectField is a generic method for reading objects out of FieldReaders
  // based on the assumption that building an address of []string{k, FIELD}
  // will result in the proper field data.