func (p *Project) RunTriggers() {
	for _, t := range p.Triggers {
		t.Run()
	}
}
attach to end events of the flows that get triggered so we know to trigger them again
then launch all trigger flows
at end of each trigger - launch the real flow
package flow
import (
	"encoding/json"
	"github.com/golang/glog"
	"time"
)
type TriggerFlow struct {
	trigger  *FlowLauncher
	launcher *FlowLauncher
}
func (tf *TriggerFlow) Run() {
	go func() {
		for {
			tf.inner()
		}
	}()
}
func (tf *TriggerFlow) inner() {
	ec := make(chan *Params)
	go tf.trigger.StartTrigger(time.Second, ec)
	glog.Infoln("started trigger:", tf.trigger.Id)
	res := <-ec
	glog.Infoln("end trigger", res)
	if res.Status != 0 {
		glog.Infoln("TRIGGER FAILED")
		return
	}
	if tf.launcher != nil {
		fc := make(chan *Params)
		go tf.launcher.Start(time.Second, fc)
		glog.Infoln("trigger:", tf.trigger.Id, "launched", tf.launcher.Id)
		res := <-fc
		glog.Infoln("end trigger launched flow", res)
		if res.Status == 0 {
			glog.Infoln("TRIGGERED FLOW SUCCEEDED")
		} else {
			glog.Infoln("TRIGGERED FLOW FAILED")
		}
	}
}
type triggerFlow struct {
	BaseLaunchable
}
func (l *triggerFlow) GetProps() *Props {
	p := l.DefaultProps()
	(*p)[KEY_TIDY_DESK] = "keep"  
	return p
}
type Project struct {
	Name          string
	FlowLaunchers map[string]*FlowLauncher
	LastResults   map[string]*FlowLaunchResult  
	RunList       map[string]*RunList           
	Triggers      map[string]*TriggerFlow       
}
func MakeProject(name string) *Project {
	return &Project{
		Name:          name,
		FlowLaunchers: map[string]*FlowLauncher{},
		LastResults:   map[string]*FlowLaunchResult{},
		Triggers:      map[string]*TriggerFlow{},
	}
}
func (p *Project) MakeTriggerLauncher(name string, flowFunc GetFlowFunc) *FlowLauncher {
	triggerFlow := &triggerFlow{}
	triggerFlow.Init(name)
	launcher := &FlowLauncher{
		Props:    triggerFlow.GetProps(),
		Name:     triggerFlow.Name(),
		Id:       triggerFlow.Id(),
		flowFunc: flowFunc,
		Threads:  1,
	}
	p.AddFlow(launcher)
	return launcher
}