Source: http://www.cs.cmu.edu/~aldrich/papers/oopsla09-cz.pdf