keyboard abstraction