func Exec(args []string, verbose bool) error {
	name := "list"
	if len(args) >= 1 {
		name = args[0]
	}
	switch name {
	case "list":
		PrintGrifts(os.Stdout)
	default:
		c := NewContext(name)
		c.Verbose = verbose
		if len(args) >= 1 {
			c.Args = args[1:]
		}
		return Run(name, c)
	}
	return nil
}
Exec the grift stack. This is the main "entry point" to
the grift system.
package grift
import (
	"fmt"
	"io"
	"log"
	"os"
	"os/exec"
	"sort"
	"strings"
	"sync"
	"time"
)
var CommandName = "grift"
var griftList = map[string]Grift{}
var descriptions = map[string]string{}
var lock = &sync.Mutex{}
var namespace string
type Grift func(c *Context) error
func Namespace(name string, s func()) error {
	defer func() {
		namespace = ""
	}()
	namespace = applyNamespace(name)
	s()
	return nil
}
func applyNamespace(name string) string {
	if namespace != "" {
		if strings.HasPrefix(name, ":") {
			return name[1:]
		}
		if name == "default" {
			return name
		}
		return fmt.Sprintf("%s:%s", namespace, name)
	}
	return name
}
func Add(name string, grift Grift) error {
	lock.Lock()
	defer lock.Unlock()
	name = applyNamespace(name)
	if griftList[name] != nil {
		fn := griftList[name]
		griftList[name] = func(c *Context) error {
			err := fn(c)
			if err != nil {
				return err
			}
			return grift(c)
		}
	} else {
		griftList[name] = grift
	}
	return nil
}
func Set(name string, grift Grift) error {
	lock.Lock()
	defer lock.Unlock()
	name = applyNamespace(name)
	griftList[name] = grift
	return nil
}
func Rename(oldName string, newName string) error {
	lock.Lock()
	defer lock.Unlock()
	oldName = applyNamespace(oldName)
	newName = applyNamespace(newName)
	if griftList[oldName] == nil {
		return fmt.Errorf("No task named %s defined!", oldName)
	}
	griftList[newName] = griftList[oldName]
	delete(griftList, oldName)
	return nil
}
func Remove(name string) error {
	lock.Lock()
	defer lock.Unlock()
	name = applyNamespace(name)
	delete(griftList, name)
	delete(descriptions, name)
	return nil
}
func Desc(name string, description string) error {
	lock.Lock()
	defer lock.Unlock()
	name = applyNamespace(name)
	descriptions[name] = description
	return nil
}
func Run(name string, c *Context) error {
	name = applyNamespace(name)
	if griftList[name] == nil {
		if name == "list" {
			PrintGrifts(os.Stdout)
			return nil
		}
		return fmt.Errorf("No task named '%s' defined!", name)
	}
	if c.Verbose {
		defer func(start time.Time) {
			log.Printf("Completed task %s in %s\n", name, time.Now().Sub(start))
		}(time.Now())
		log.Printf("Starting task %s\n", name)
	}
	return griftList[name](c)
}
func List() []string {
	keys := []string{}
	for k := range griftList {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	return keys
}