refactor: maintain abstraction