code: func execAction(action Action, opts map[string]interface{}) bool {
  	a := Action{
  		Bee:  action.Bee,
  		Name: action.Name,
  	}
  
  	for _, opt := range action.Options {
  		ph := Placeholder{
  			Name: opt.Name,
  		}
  
  		switch opt.Value.(type) {
  		case string:
  			var value bytes.Buffer
  
  			tmpl, err := template.New(action.Bee + "_" + action.Name + "_" + opt.Name).Funcs(templatehelper.FuncMap).Parse(opt.Value.(string))
  			if err == nil {
  				err = tmpl.Execute(&value, opts)
  			}
  			if err != nil {
  				panic(err)
  			}
  
  			ph.Type = "string"
  			ph.Value = value.String()
  
  		default:
  			ph.Type = opt.Type
  			ph.Value = opt.Value
  		}
  		a.Options = append(a.Options, ph)
  	}
  
  	bee := GetBee(a.Bee)
  	if (*bee).IsRunning() {
  		(*bee).LogAction()
  
  		log.Println("\tExecuting action:", a.Bee, "/", a.Name, "-", GetActionDescriptor(&a).Description)
  		for _, v := range a.Options {
  			log.Println("\t\tOptions:", v)
  		}
  
  		(*bee).Action(a)
  	} else {
  		log.Println("\tNot executing action on stopped bee:", a.Bee, "/", a.Name, "-", GetActionDescriptor(&a).Description)
  		for _, v := range a.Options {
  			log.Println("\t\tOptions:", v)
  		}
  	}
  
  	return true
  }
docs: // execAction executes an action and map its ins & outs.