"I was born not knowing and have only had a little time to change that here and there."
– Richard Feynman
The idea of companion objects gave us the feeling that it's important to know how your programming language treats the constructs you write. Suppose you were given a task to generate a case class with some sensitive parameters (by sensitive, we mean when trying to print that class, those sensitive fields should print some dummy values). What you are going to do in order to achieve that entirely depends on your knowledge of how Scala treats the case classes, and we learned that in the previous chapter. So, what now? Now it's time to do some composition as well as use inheritance. Remember, we talked about how we should think of a class as a type that we can define? It's a really useful and fun task to...