Made abstract classes for better implementation ability