The traits that Vcs depends on to implement its functionality.
Vcs is parametrized by a list of specific interfaces and classes that constitute the low level operations needed by Vcs. We call them traits.
The intended usage for a library that requires Vcs functionality is to specify via the type of the vcs value, the exact list of traits required. Doing this in this way, allows for flexibility, as any backend supplying that list of traits or more will be compatible as a backend to be supplied to your code.
For example, consider a function that needs to list all the files under version control, and show their contents at some revision. Such functionality will require:
This is a special class constructor that creates an object that satisfies the interface defined by the class type t, but where each of the actual method implementation is a function that returns an error indicating that the method is unimplemented.