code: func (a *ActionDefinition) ValidateParams() *dslengine.ValidationErrors {
  	verr := new(dslengine.ValidationErrors)
  	if a.Params == nil {
  		return nil
  	}
  	params, ok := a.Params.Type.(Object)
  	if !ok {
  		verr.Add(a, `"Params" field of action is not an object`)
  	}
  	var wcs []string
  	for _, r := range a.Routes {
  		rwcs := ExtractWildcards(r.FullPath())
  		for _, rwc := range rwcs {
  			found := false
  			for _, wc := range wcs {
  				if rwc == wc {
  					found = true
  					break
  				}
  			}
  			if !found {
  				wcs = append(wcs, rwc)
  			}
  		}
  	}
  	for n, p := range params {
  		if n == "" {
  			verr.Add(a, "action has parameter with no name")
  		} else if p == nil {
  			verr.Add(a, "definition of parameter %s cannot be nil", n)
  		} else if p.Type == nil {
  			verr.Add(a, "type of parameter %s cannot be nil", n)
  		}
  		if p.Type.Kind() == ObjectKind {
  			verr.Add(a, `parameter %s cannot be an object, only action payloads may be of type object`, n)
  		} else if p.Type.Kind() == HashKind {
  			verr.Add(a, `parameter %s cannot be a hash, only action payloads may be of type hash`, n)
  		}
  		ctx := fmt.Sprintf("parameter %s", n)
  		verr.Merge(p.Validate(ctx, a))
  	}
  	for _, resp := range a.Responses {
  		verr.Merge(resp.Validate())
  	}
  	return verr.AsError()
  }
docs: // ValidateParams checks the action parameters (make sure they have names, members and types).