code: func scanModel(fieldNames []string, fieldValues []interface{}, mr *modelRef) error {
  	ms := mr.spec
  	if fieldValues == nil || len(fieldValues) == 0 {
  		return newModelNotFoundError(mr)
  	}
  	for i, reply := range fieldValues {
  		if reply == nil {
  			continue
  		}
  		fieldName := fieldNames[i]
  		replyBytes, err := redis.Bytes(reply, nil)
  		if err != nil {
  			return err
  		}
  		if fieldName == "-" {
  			// The ID is signified by the field name "-" since that cannot
  			// possibly collide with other field names.
  			mr.model.SetModelID(string(replyBytes))
  			continue
  		}
  		fs, found := ms.fieldsByName[fieldName]
  		if !found {
  			return fmt.Errorf("zoom: Error in scanModel: Could not find field %s in %T", fieldName, mr.model)
  		}
  		fieldVal := mr.fieldValue(fieldName)
  		switch fs.kind {
  		case primativeField:
  			if err := scanPrimitiveVal(replyBytes, fieldVal); err != nil {
  				return err
  			}
  		case pointerField:
  			if err := scanPointerVal(replyBytes, fieldVal); err != nil {
  				return err
  			}
  		default:
  			if err := scanInconvertibleVal(mr.spec.fallback, replyBytes, fieldVal); err != nil {
  				return err
  			}
  		}
  	}
  	return nil
  }
docs: // scanModel iterates through fieldValues, converts each value to the correct type, and
  // scans the value into the fields of mr.model. It expects fieldValues to be the output
  // from an HMGET command from redis, without the field names included. The order of the
  // values in fieldValues must match the order of the corresponding field names. The id
  // field is special and should have the field name "-", which will be set with the SetModelID
  // method. fieldNames should be the actual field names as they appear in the struct definition,
  // not the redis names which may be custom.