encapsulating a data source. This allows us to pass around native file formats in virtual functions without resorting to using the filename.