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