The GNOME::Stream and GNOME::Storage interfaces specify how we can deal with compound documents. Of course, without an implementation these interfaces aren't terribly useful. Fortunately, Bonobo comes with such an implementation: libefs. Note that libefs addresses the need for a file-based stream/storage implementation. However, Bonobo also provides a memory-based implementation.
The libefs library was written by Dietmar Maurer and implements the filesystem-in-a-file principle. However, libefs is quite flexible and allows the use of various back-end drivers - i.e. the physical structure of a compound file could be either one single file, or a directory tree where all objects in the compound files are separate file.
libefs has a very familiar UNIX-like API, thus making working with compound files relatively easy. The main difference is probably speed - libefs is quite a bit slower than the 'regular' UNIX API. This issue might be resolved by writing a kernel driver for compound files.
The libefs library is very much a work-in-progress. For example, the compound file implementation does not free any deleted streams or storages. This means a document can collect a lot of garbage. At this moment the only work-around is to do a 'Save-as', which will create a tidy new file.
We won't discuss the details of libefs here - please refer to the libefs documentation. For our (Bonobo) purposes it suffices to say that libefs is the file-based implementation of streams and stores.