use abstract classes for base