This packages gathers classes used to represent identifiers of objects involved in dependency management.

As identifiers, they do not store any information on the module content and detailed metadata (like dependencies).

## Classes

ModuleId
  is used as the identifier of module, without considering its version. It's basically an organization and module name couple.
ModuleRevisionId
  is used as the identifier of a module in a particular version or version constraint. It is composed of a ModuleId, a revision, and optionally a branch and extra attributes.
ArtifactId
  identifies an artifact without considering its version. It's basically a ModuleId and an artifact name, type and extension, plus optional extra attributes.
ArtifactRevisionId
  identifies an artifact of a module in a particular version. It is composed of a ModuleRevisionId along with artifact identifier like the name type and extension.

## Text Representation

These classes share an homogeneous text representation, which can be easily obtained through the toString() method.

The general pattern is: `[organisation]#[module]#[branch];[revision]![artifact].[ext]([type])` The # before the branch is present only if the branch is not empty.
The type and surrounding parenthesis are present only if different from the extension.

A textual representation can be parsed into an object (supported for ModuleRevisionId only yet), as long as a strict set of characters is used for each field (which is recommended).

Allowed characters are:

organisation
  `a-z A-Z 0-9 - / . _ + =`
module
  `a-z A-Z 0-9 - / . _ + =`
branch
  `a-z A-Z 0-9 - / . _ + =`
revision
  `a-z A-Z 0-9 - / . _ + = , [ ] { } ( ) : @`
artifact
  `a-z A-Z 0-9 - / . _ + =`
extension
  `a-z A-Z 0-9 - / . _ + =`
type
  `a-z A-Z 0-9 - / . _ + =`