module voxelman.eventdispatcher.plugin;

import pluginlib;
import voxelman.core.config;

private alias EventHandler = void delegate(ref Object event);


class EventDispatcherPlugin : IPlugin
{
	mixin IdAndSemverFrom!"voxelman.eventdispatcher.plugininfo";

	void subscribeToEvent(Event)(void delegate(ref Event event) handler)
	{
		_eventHandlers[typeid(Event)] ~= cast(EventHandler)handler;
	}

	void postEvent(Event)(auto ref Event event)
	{
		auto handlers = typeid(Event) in _eventHandlers;
		if (!handlers) return;

		foreach(handler; *handlers)
		{
			(cast(void delegate(ref Event))handler)(event);
		}
	}

private:

	EventHandler[][TypeInfo] _eventHandlers;
}