add basic event dispatcher (ported from symphony framework)