Could we maybe handle that by instantiating new adapters (using `self.class`, to get subclasses' behaviors) and caching those on here? Then each adapter instance only has to worry about one class, simplifying the majority of the implementation.