code: func verifyConversionFunctionSignature(ft reflect.Type) error {
  	if ft.Kind() != reflect.Func {
  		return fmt.Errorf("expected func, got: %v", ft)
  	}
  	if ft.NumIn() != 3 {
  		return fmt.Errorf("expected three 'in' params, got: %v", ft)
  	}
  	if ft.NumOut() != 1 {
  		return fmt.Errorf("expected one 'out' param, got: %v", ft)
  	}
  	if ft.In(0).Kind() != reflect.Ptr {
  		return fmt.Errorf("expected pointer arg for 'in' param 0, got: %v", ft)
  	}
  	if ft.In(1).Kind() != reflect.Ptr {
  		return fmt.Errorf("expected pointer arg for 'in' param 1, got: %v", ft)
  	}
  	scopeType := Scope(nil)
  	if e, a := reflect.TypeOf(&scopeType).Elem(), ft.In(2); e != a {
  		return fmt.Errorf("expected '%v' arg for 'in' param 2, got '%v' (%v)", e, a, ft)
  	}
  	var forErrorType error
  	// This convolution is necessary, otherwise TypeOf picks up on the fact
  	// that forErrorType is nil.
  	errorType := reflect.TypeOf(&forErrorType).Elem()
  	if ft.Out(0) != errorType {
  		return fmt.Errorf("expected error return, got: %v", ft)
  	}
  	return nil
  }
docs: // Verifies whether a conversion function has a correct signature.