reader abstraction