Source: https://www.cs.colorado.edu/~kena/classes/5448/s11/presentations/alzabarah_oop.pdf