An introduction to Object Oriented Design Patterns and the Principles that drive them. Examples in Ruby