#include <functional>
#include <list>
#include <iostream>
#include <string>


template <class H> struct IX {
virtual ~IX() {}
virtual void AddHandler(H handler) = 0; };

template <class A> struct Event : IX<std::function<void(A)>> {
void AddHandler(std::function<void(A)> handler) { mHandlers.push_back(std::move(handler)); }
void Fire(A argument) {
	for(auto i = mHandlers.begin(), e = mHandlers.end(); i != e; ++i) {
		std::function<void(A)> & handler(*i);
		if(handler) {
			handler(argument);
		}
	}
}
private:
std::list<std::function<void(A)>> mHandlers; };

struct SomeSender {
SomeSender(std::string const & name) : mName(name) { }
IX<std::function<void(std::string const &)>> & OnNameChanged(void) { return mOnNameChanged; }
void ChangeName(std::string const & name) { mName = name; mOnNameChanged.Fire(mName); }
private:
Event<std::string const &> mOnNameChanged;
std::string mName;
};



int main(void) {
	SomeSender ss("Bob");
	ss.OnNameChanged().AddHandler([](std::string const & name) {
		std::cout << name << "!" << std::endl;
	});
	ss.OnNameChanged().AddHandler([](std::string const & name) {
		std::cout << name << "?" << std::endl;
	});
	ss.ChangeName("Alice");
//	ss.OnNameChanged().Fire("hoge");
	std::getchar();
	return 0;
}
