improved event dispatch (still not ideal)