A dependency injection container.
Providers are registered with a TypeInfo and an optional name. Values can then be resolved using the TypeInfo and name.
Register a Provider for it's TypeInfo. A name can also be provided to disambiguate when multiple providers are needed
Register a factory function for a type.
Register a provider using the type returned by provider.providedType.
Register a Class.
Register a single value.
Resolve an instance of the type of TypeInfo, and execute a delegate with a pointer to that instance (as a void*).
Resolve an instance of type T. If name is provided use that to disambiguate between multiple providers.
Check if the resolver can resolve a type (possibly with a name).