initial cut at event dispatcher