Protocol inheritance is a powerful tool that lets you easily create a new protocol that adds requirements to an existing protocol or set of protocols. Nevertheless, using protocol inheritance can potentially lead you to make poor decisions in creating your types. In fact, that is exactly what has happened with TabularDataSource when you made it inherit from CustomStringConvertible because you wanted to be able to print a description of the data source. (In fairness, you did it because we told you to.) There is not anything inherently CustomStringConvertible about a tabular data source. Go back and fix that misguided attempt to print data sources.
TabularDataSource should not be