#ifndef __CALLBACK_H__
#define __CALLBACK_H__

class CallbackBase
{
	public:
		virtual void operator()() const { };
		virtual ~CallbackBase(){} // = 0;
};

// CallbackBase::~CallbackBase() {}

template<typename T>
class Callback0 : public CallbackBase
{
	public:
		typedef void (T::*F)(void);

		Callback0( T& t, F f) : _instance(&t), _memberFunction(f) { }
		void operator()() const { (_instance->*_memberFunction)(); }

	private:
		T*			_instance;
		F			_memberFunction;
};

template<typename T, typename EventT>
class Callback1 : public CallbackBase
{
	public:
		typedef void (T::*F)(EventT);

		Callback1( T& t, F f, EventT arg) : _instance(&t), _memberFunction(f), _arg(arg) { }
		void operator()() const { (_instance->*_memberFunction)(static_cast<EventT>(_arg)); }

	private:
		T*					_instance;
		F					_memberFunction;
		EventT				_arg;
};

#endif // __CALLBACK_H__
