Source: https://people.cs.aau.dk/~normark/oop-csharp/pdf/all.pdf