class Message {

    public static Message of(String requestedKey,
                             MessageTemplate messageTemplate,
                             Object[] messageParameters) {

        ObjectUtil.requireNotNull(requestedKey, "requestedKey can't be null");
        ObjectUtil.requireNotNull(messageTemplate, "messageTemplate can't be null");
        ObjectUtil.requireNotNull(messageParameters, "messageParameters can't be null");

        messageParameters = validateParameters(messageTemplate.getKey(), requestedKey, messageParameters);
        validateMessageTextFormat(messageTemplate.getText(), messageParameters);

        return new Message(requestedKey, messageTemplate, messageParameters);
    }

    private  Message(String requestedKey,
                    MessageTemplate messageTemplate,
                    Object[] messageParameters);

}