some beginning abstraction