If the adapter returns SupportType::Derived and another adapter returns SupportType::Direct then the adapter that can directly drive the class is chosen to drive the cache. If multiple adapters return SupportType::Direct then the first is chosen. If multiple adapters return SupportType::Derived then the adapter with the closest desired class will be chosen (closest in terms of inheritance hierarchy between the desired direct class and the provided class)