Gerenciando versões conflitantes de ruby gems
Estou construindo uma estrutura que carrega o código ruby fornecido pelo usuário. É basicamente um mecanismo de plug-in. Quero que o usuário forneça código ruby para poder exigir suas próprias gemas. Pretendo que o pacote "plugin" inclua um diretório de fornecedores com as gemas.
Como posso carregar gemas exigidas pelo plug-in sem que elas conflitem com as gemas da minha estrutura? Por exemplo, se minha estrutura usa a copa das árvores 1.3.0, e um plug-in usa a copa das árvores 1.4.2, quero que cada um trabalhe com sua versão especificada.
Da mesma forma, existe uma maneira de impedir que os plug-ins entrem em conflito entre si?
Eu olhei para gem_plugin, _why sandbox, e algumas outras ferramentas. Mas não vejo nenhuma biblioteca que lide especificamente com esse caso - presumo que isso já tenha sido feito antes.
Também observei as partes internas do Bundler para ver como ele gerencia as versões das gemas. Estou preparado para fazer algumas coisas bastante complexas, se necessário. Mas ainda não tenho certeza de como fazê-lo.
Eu também tenho muita liberdade em como implemento isso. Então, se você acha que estou latindo na árvore errada, diga.
Obrigado por qualquer conselho.
NOTA LATERAL: Ocorreu-me ao escrever isso que eu precisava de algo semelhante aos Classloaders em um contêiner de servlet Java. Um arquivo WAR pode incluir arquivos jar, e o carregador de classes do aplicativo da web preferirá aqueles sobre os jarros que estão no caminho de classe global. Existe alguma maneira no ruby de segmentar o "caminho da classe" do ruby (ou seja, load_path, require, etc)?