http://pushcpp.blogspot.com/2014/09/modern-c-at-work-to-build-extensible.html