Source: https://lmeyerov.github.io/projects/socioplt/papers/oopsla2013.pdf