template<class M>
struct Message_ : Message
{
    Message_(void)
    {
    }
    static bool checkType(Message* message)
    {
        return Message_<M>::getID_static() == message->getID() ? true : false;
    }
    static M* convert(Message* message)
    {
        if (Message_<M>::getID_static() == message->getID())
            return (M*)message;
        return NULL;
    }
    virtual const int getID(void) const
    {
        return Message_<M>::getID_static();
    }
    static int getID_static(void)
    {
        if (Message_<M>::TypeIDRef_Custom == -1)
            return (int)&Message_<M>::TypeIDRef;
        return Message_<M>::TypeIDRef_Custom;
    }
    static void setID_static(int id)
    {
        Message_<M>::TypeIDRef_Custom = id;
    }
private:
    static const int TypeIDRef;
    static int TypeIDRef_Custom;
};