refactored AbstractBuilder