Ruby modèle de conception: Comment faire un extensible usine de classe?

Ok, supposons que j'ai Ruby programme pour lire de contrôle de version des fichiers journaux et de faire quelque chose avec les données. (Je ne suis pas, mais la situation est analogue, et je m'amuse avec ces analogies). Supposons maintenant je veux soutenir Bazar et Git. Supposons que le programme sera exécuté, avec une sorte d'argument indiquant la version de logiciel de contrôle est utilisé.

Compte tenu de cela, je veux faire une LogFileReaderFactory qui donné le nom d'un programme de contrôle de version sera de retour un journal approprié lecteur de fichiers (sous-classé d'un générique) pour lire le fichier journal et cracher un canoniques de la représentation interne. Alors, bien sûr, je peux faire BazaarLogFileReader et GitLogFileReader et du code en dur dans le programme, mais je veux qu'il soit mis en place de telle manière que l'ajout du support pour un nouveau programme de contrôle de version est aussi simple que de dépenser une nouvelle classe de fichier dans le répertoire avec le Bazar et Git lecteurs.

Alors, maintenant, vous pouvez appeler le "faire-quelque chose-avec-le-log --logiciel git" et "faire-quelque chose-avec-le-log --logiciel de bazar", car il y a des lecteurs des journaux pour ceux. Ce que je veux, c'est pour qu'il soit possible d'ajouter simplement une SVNLogFileReader classe et le fichier dans le même répertoire et automatiquement être en mesure d'appeler des "faire-quelque chose-avec-le-log --logiciel svn", sans AUCUN changement pour le reste du programme. (Les fichiers peuvent bien sûr être nommé avec un motif spécifique et globbed dans le besoin d'appel.)

Je sais que cela peut être fait en Ruby... je n'ai juste pas comment je dois le faire... ou si je dois le faire.