added event interface and abstract class