maintain abstraction barrier