http://msdn.microsoft.com/practices/Topics/patterns/default.aspx