code: func ReverseURL(args ...interface{}) (template.URL, error) {
  	if len(args) == 0 {
  		return "", errors.New("no arguments provided to reverse route")
  	}
  
  	action := args[0].(string)
  	if action == "Root" {
  		return template.URL(AppRoot), nil
  	}
  
  	pathData, found := splitActionPath(nil, action, true)
  
  	if !found {
  		return "", fmt.Errorf("reversing '%s', expected 'Controller.Action'", action)
  	}
  
  	// Look up the types.
  
  	if pathData.TypeOfController == nil {
  		return "", fmt.Errorf("Failed reversing %s: controller not found %#v", action, pathData)
  	}
  
  	// Note method name is case insensitive search
  	methodType := pathData.TypeOfController.Method(pathData.MethodName)
  	if methodType == nil {
  		return "", errors.New("revel/controller: In " + action + " failed to find function " + pathData.MethodName)
  	}
  
  	if len(methodType.Args) < len(args)-1 {
  		return "", fmt.Errorf("reversing %s: route defines %d args, but received %d",
  			action, len(methodType.Args), len(args)-1)
  	}
  	// Unbind the arguments.
  	argsByName := make(map[string]string)
  	// Bind any static args first
  	fixedParams := len(pathData.FixedParamsByName)
  
  	for i, argValue := range args[1:] {
  		Unbind(argsByName, methodType.Args[i+fixedParams].Name, argValue)
  	}
  
  	return template.URL(MainRouter.Reverse(args[0].(string), argsByName).URL), nil
  }
docs: /////////////////////
  // Template functions
  /////////////////////
  // ReverseURL returns a url capable of invoking a given controller method:
  // "Application.ShowApp 123" => "/app/123"