refactored abstract