Source: https://cs.brynmawr.edu/Courses/cs246/spring2013/slides/08Classes.pdf