Software Architecture and Design: The Practical Guide to Design Patterns