project refactored to factory format + subclasses