A capability is intended to be an enum, but since the valid
values may vary from version to version, an interface is defined instead,
which various enum values should implement. All capabilities are required
to return a namespace as well, which, in combination with the name, should
uniquely identify this capability. Generally, the namespace should return the
fully qualified class name.