(http://csharppad.com/gist/9483251)