The system was designed in a manner such that it could be easily ported from one application to another with minimal effort other than providing the domain-specific knowledge regarding the new application.
we decided to abstract away the domain-specific information into self-contained modules while keeping the other modules completely independent.