abstraction layer