code: func NewRobot(v ...interface{}) *Robot {
  	r := &Robot{
  		Name:        fmt.Sprintf("%X", Rand(int(^uint(0)>>1))),
  		connections: &Connections{},
  		devices:     &Devices{},
  		done:        make(chan bool, 1),
  		trap: func(c chan os.Signal) {
  			signal.Notify(c, os.Interrupt)
  		},
  		AutoRun:   true,
  		Work:      nil,
  		Eventer:   NewEventer(),
  		Commander: NewCommander(),
  	}
  
  	for i := range v {
  		switch v[i].(type) {
  		case string:
  			r.Name = v[i].(string)
  		case []Connection:
  			log.Println("Initializing connections...")
  			for _, connection := range v[i].([]Connection) {
  				c := r.AddConnection(connection)
  				log.Println("Initializing connection", c.Name(), "...")
  			}
  		case []Device:
  			log.Println("Initializing devices...")
  			for _, device := range v[i].([]Device) {
  				d := r.AddDevice(device)
  				log.Println("Initializing device", d.Name(), "...")
  			}
  		case func():
  			r.Work = v[i].(func())
  		}
  	}
  
  	r.running.Store(false)
  	log.Println("Robot", r.Name, "initialized.")
  
  	return r
  }
docs: // NewRobot returns a new Robot. It supports the following optional params:
  //
  //		name:	string with the name of the Robot. A name will be automatically generated if no name is supplied.
  // 	[]Connection: Connections which are automatically started and stopped with the robot
  //		[]Device: Devices which are automatically started and stopped with the robot
  //		func(): The work routine the robot will execute once all devices and connections have been initialized and started
  //