Source: https://homepages.cwi.nl/~storm/teaching/reader/HannemannKiczales02.pdf