software abstraction layers