https://shikhalev.org/2016/03/introspection.html