proper abstraction