Input abstraction