Source: http://www.cs.tau.ac.il/~msagiv/courses/pl15/new-scala.pdf