Introduction to decorators

Functions III showed that functions are values: you can pass them around and return them. Decorators are the natural next step: a small wrapper function that takes another function in, adds some behaviour, and returns a replacement. The @ symbol is just a shortcut for that pattern.