added abstract classes for easy use of engine