#include <cstdlib>

#include <iostream>
#include <typeinfo>

#include <cxxabi.h>

class AutoRegister
{
    class InitializerPrivate
    {
    };

public:
    explicit AutoRegister(const InitializerPrivate&)
    {
    }

    template <class Child>
    class Initializer : public InitializerPrivate
    {
        class StaticInit
        {
        public:
            StaticInit()
            {
                int status;
                char *childName = abi::__cxa_demangle(typeid(Child).name(), 0, 0, &status);
                std::cout << "Registering child: " << childName << std::endl;
                // XXX: qRegisterMetaType<EventFoo>("EventFoo");
                std::free(childName);
            }

            void nop() const
            {

            }
        };

        static const StaticInit _init;

    public:
        explicit Initializer()
        {
            _init.nop();
        }
    };
};

class BaseEvent : protected virtual AutoRegister
{
public:
    explicit BaseEvent() : AutoRegister(Initializer<BaseEvent>())
    {
    }
};

class EventFoo : public BaseEvent
{
public:
    explicit EventFoo() : AutoRegister(Initializer<EventFoo>())
    {
    }
};

class EventBar : public BaseEvent
{
public:
    explicit EventBar() : AutoRegister(Initializer<EventBar>())
    {
    }
};

template<class T>
const typename AutoRegister::Initializer<T>::StaticInit AutoRegister::Initializer<T>::_init = typename AutoRegister::Initializer<T>::StaticInit();

int main(void)
{
    return 0;
}
