abstraction layer programming