func (c *Cmd) Strings(p StringsParam) *[]string {
	into := new([]string)
	value := values.NewStrings(into, p.value())
	switch x := p.(type) {
	case StringsOpt:
		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	case StringsArg:
		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	default:
		panic(fmt.Sprintf("Unhandled param %v", p))
	}
	return into
}
/*
Strings can be used to add a string slice option or argument to a command.
It accepts either a StringsOpt or a StringsArg struct.

The result should be stored in a variable (a pointer to a string slice) which will be populated when the app is run and the call arguments get parsed
package cli
import (
	"flag"
	"fmt"
	"strings"
	"text/tabwriter"
	"github.com/jawher/mow.cli/internal/container"
	"github.com/jawher/mow.cli/internal/flow"
	"github.com/jawher/mow.cli/internal/fsm"
	"github.com/jawher/mow.cli/internal/lexer"
	"github.com/jawher/mow.cli/internal/parser"
	"github.com/jawher/mow.cli/internal/values"
)
type Cmd struct {
	Action func()
	Before func()
	After func()
	Spec string
	LongDesc string
	ErrorHandling flag.ErrorHandling
	init    CmdInitializer
	name    string
	aliases []string
	desc    string
	commands   []*Cmd
	options    []*container.Container
	optionsIdx map[string]*container.Container
	args       []*container.Container
	argsIdx    map[string]*container.Container
	parents []string
	fsm *fsm.State
}
type BoolParam interface {
	value() bool
}
type StringParam interface {
	value() string
}
type IntParam interface {
	value() int
}
type StringsParam interface {
	value() []string
}
type IntsParam interface {
	value() []int
}
type VarParam interface {
	value() flag.Value
}
type CmdInitializer func(*Cmd)
func (c *Cmd) Command(name, desc string, init CmdInitializer) {
	aliases := strings.Fields(name)
	c.commands = append(c.commands, &Cmd{
		ErrorHandling: c.ErrorHandling,
		name:          aliases[0],
		aliases:       aliases,
		desc:          desc,
		init:          init,
		commands:      []*Cmd{},
		options:       []*container.Container{},
		optionsIdx:    map[string]*container.Container{},
		args:          []*container.Container{},
		argsIdx:       map[string]*container.Container{},
	})
}
func (c *Cmd) Bool(p BoolParam) *bool {
	into := new(bool)
	value := values.NewBool(into, p.value())
	switch x := p.(type) {
	case BoolOpt:
		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	case BoolArg:
		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	default:
		panic(fmt.Sprintf("Unhandled param %v", p))
	}
	return into
}
func (c *Cmd) String(p StringParam) *string {
	into := new(string)
	value := values.NewString(into, p.value())
	switch x := p.(type) {
	case StringOpt:
		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	case StringArg:
		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	default:
		panic(fmt.Sprintf("Unhandled param %v", p))
	}
	return into
}
func (c *Cmd) Int(p IntParam) *int {
	into := new(int)
	value := values.NewInt(into, p.value())
	switch x := p.(type) {
	case IntOpt:
		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	case IntArg:
		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
	default:
		panic(fmt.Sprintf("Unhandled param %v", p))
	}
	return into
}