Source: https://www2.cs.arizona.edu/~mercer/compfun3/presentations/06_Classes.pdf