http://skeeter.socs.uoguelph.ca/~matsakis/CIS2520/A2.pdf