refactored into mostly OO model