Flexible Software Design by Bruce Johnson & Robert Miller