anchor.diff:    - the class derives its lifetime from its shortest living dependency
     - if no dependencies, then longest possible lifetime
   
  -TODO:
  -- unify data types accepted / returned by functions
  -- immutability or mutability?
  -
   *)
  
positive.code:   - for each class with no dependencies, assign 0
    - then, for each class whose dependencies have level assigned (all of them), assign highest dependency level + 1
    - repeat above step until all levels are assigned
  
  ResolveLifetimes (dependencyGraph, (initialMap?) -> registrations)
  - order classes (registrations) by dependancyLevel
  
negative.code: BuildDependencyMap (classToInterfaceMap -> dependencyMap)
  - for each class, resolve classes (not interfaces) it depends on
    - if interface with no implementation encountered, then exception
  
  BuildDependencyGraph (dependencyMap -> dependencyGraph)
  - (the graph is a directed acyclic graph, DAG)
  