http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx