code: func binder(r *http.Request, v Binder) error {
  	rv := reflect.ValueOf(v)
  	if rv.Kind() == reflect.Ptr {
  		rv = rv.Elem()
  	}
  
  	// Call Binder on non-struct types right away
  	if rv.Kind() != reflect.Struct {
  		return v.Bind(r)
  	}
  
  	// For structs, we call Bind on each field that implements Binder
  	for i := 0; i < rv.NumField(); i++ {
  		f := rv.Field(i)
  		if f.Type().Implements(binderType) {
  
  			if isNil(f) {
  				continue
  			}
  
  			fv := f.Interface().(Binder)
  			if err := binder(r, fv); err != nil {
  				return err
  			}
  		}
  	}
  
  	// We call it bottom-up
  	if err := v.Bind(r); err != nil {
  		return err
  	}
  
  	return nil
  }
docs: // Executed bottom-up