code: func NewMessage(payload string, agent string, collective string, msgType string, request *Message, choria *Framework) (msg *Message, err error) {
  	id, err := choria.NewRequestID()
  	if err != nil {
  		return
  	}
  
  	msg = &Message{
  		Payload:         payload,
  		RequestID:       id,
  		TTL:             choria.Config.TTL,
  		DiscoveredHosts: []string{},
  		SenderID:        choria.Config.Identity,
  		CallerID:        choria.CallerID(),
  		Filter:          protocol.NewFilter(),
  		choria:          choria,
  	}
  
  	err = msg.SetType(msgType)
  	if err != nil {
  		return
  	}
  
  	if request == nil {
  		msg.Agent = agent
  		err = msg.SetCollective(collective)
  		if err != nil {
  			return
  		}
  	} else {
  		msg.Request = request
  		msg.Agent = request.Agent
  		msg.replyTo = request.ReplyTo()
  		msg.SetType("reply")
  		err = msg.SetCollective(request.collective)
  		if err != nil {
  			return
  		}
  	}
  
  	_, err = msg.Validate()
  
  	return
  }
docs: // NewMessage constructs a basic Message instance