/**
  * Reply to a message. The message an {@link IInternalMessage} or a {@link Map} with a "content"
  * key with the return Object.
  */
 @SuppressWarnings("unchecked")
 public void reply(String pid, Object in, Object out) throws BpmScriptException {
   IInternalMessage messageToSend = null;
   String correlationId = ((IInternalMessage) in).getCorrelationId();
   if (out instanceof ExceptionMessage) {
     ExceptionMessage exceptionMessage = (ExceptionMessage) out;
     exceptionMessage.setCorrelationId(correlationId);
     messageToSend = exceptionMessage;
   } else if (out instanceof ResponseMessage) {
     ResponseMessage responseMessage = (ResponseMessage) out;
     responseMessage.setCorrelationId(correlationId);
     messageToSend = responseMessage;
   } else {
     Map<String, Object> map = (Map<String, Object>) out;
     Object content = map.get("content");
     if (content != null && content instanceof Throwable) {
       messageToSend = new ExceptionMessage(correlationId, (Throwable) content);
     } else {
       messageToSend = new MapResponseMessage(map);
     }
     map.put("correlationId", correlationId);
   }
   if (in instanceof IInvocationMessage) {
     final IInvocationMessage inMessage = (IInvocationMessage) in;
     sender.send(inMessage.getReplyTo(), messageToSend);
   } else {
     sender.send(errorAddress, messageToSend);
   }
 }