refactor abstract interface