added some classes for abstraction