#include <iostream>
#include <vector>
#include <functional>

namespace TGE
{
    class EventListener
    {
        public:
            typedef struct
            {
                std::function<void()> run;
                bool triggered;
                std::string name;
            } Event;

            template <typename F>
			void newEvent(F onRun, std::string eventName)
            {
                Event newEvent;
                newEvent.name = eventName;
                newEvent.triggered = false;
                newEvent.run = onRun;
                eventStack.push_back(newEvent);
            }

            void trigger(std::string eventName)
            {
                std::vector<Event>::iterator itr;

                for(itr = eventStack.begin(); itr != eventStack.end(); itr++)
                {
                    if(itr->name == eventName) itr->triggered = true;
                }
            }

        protected:
            std::vector<Event> eventStack;
    };
}

class MenuState : protected TGE::EventListener
{
    public:
        void enter()
        {
            newEvent([=](){Event1();}, "Event1");
            trigger("Event1");

            std::vector<Event>::iterator itr;
            for(itr = eventStack.begin(); itr != eventStack.end(); itr++)
            {
                if(itr->triggered)
                {
                    itr->run();
                    itr->triggered = false;
                }
            }
        }

        void Event1()
        {
            std::cout << "Event1";
        }
};

int main()
{
    MenuState* menuState = 0;
    menuState = new MenuState();
    menuState->enter();

    return 0;
}