device abstraction