Source: http://www.i3s.unice.fr/~tettaman/Classes/AlgoProgObjet/APO-CM06.pdf