Builders are similar to factories, a creational pattern coming from the Gang of Four. Unlike factories, they can help you build more complex objects: those that cannot be built in a single step, such as types assembled from many separate parts. They also provide you with a way to customize the construction of objects. In our case, we'll skip designing complex hierarchies of builders. Instead, we'll show how a builder can help. We'll leave implementing hierarchies to you, as an exercise.
Builders are needed when an object cannot be produced in a single step, but having a fluent interface can just make them pleasant to use if the single step is not trivial. Let's demonstrate creating fluent builder hierarchies using CRTP.
In our case, we'll create a CRTP, GenericItemBuilder, that we'll use as our base builder, and FetchingItemBuilder, which will be a more specialized one that can fetches data using a remote address if that's a supported...