====== Repository ======

The repository objects handle the source of the data, the [[page]] object handles the content of the data. Therefore something went wrong when any other object outside the repository needs to know a file name for a page. The page object uses filehandles, but it needs the repository to open them.

The repository is the object that manages where data comes from and where it goes to when you save it. The default repository maps the pages to simple text files, but adds some logic to deal with things like case-sensitivity. The GUI only has to deal with one repository object, it is not possible to open multiple repositories. All page names are resolved within this repository. But it is possible to have "child" repositories under this root repository. This model can be thought of as a filesystem with mount-points. A child repository takes control of one namespace and all namespaces below that node.

Pages within the repository can be organized with namespaces. In the default repository these map to directories. But if a repository maps to a table in a database these namespaces would probably just be another column in this table. Repositories that do not have a hierarchical representation don't have to show a namespace list at all.

The GUI is always allowed to ask to load a page that does not exist and/or is not shown in the namespace list. In this case either a new page can be created or the request can be ignored.

The top level API for the repository is through Zim.pm, this object does little apart from checking the method arguments and then dispatches to an object of the class Store. The dispatch is done by namespace, so different parts of the tree can be managed by different backends.
