Programmers make abstractions constantly. Functions are abstractions. Classes are abstractions. But sometimes it's not enough. If you find yourself writing boilerplate "design patterns" again and ...