abstract event creation