Ruby: código heredado que funciona con variables de clase

La situación: tengo varias clases que deberían contener una variable con un hash de configuración; un hash diferente para cada clase pero el mismo para todas las instancias de una clase.

Al principio, lo intenté así.

class A
  def self.init config
    @@config = config
  end

  def config
    @@config
  end
end

class B < A; end
class C < A; end

Pero pronto se dio cuenta de que no funcionaría de esa manera porque @@ config se mantiene en el contexto de A, no B o C, por lo tanto:

B.init "bar"
p B.new.config  # => "bar"
p C.new.config  # => "bar" - which would be nil if B had it's own @@config

C.init "foo"
p B.new.config  # => "foo" - which would still be "bar" if C had it's own @@config
p C.new.config  # => "foo"

Pensé en usarlo así:

modules = [B, C]
modules.each do |m|
  m.init(@config[m.name])
end
# ...
B.new  # which should then have the correct config

Ahora me queda claro por qué sucede eso, pero no estoy seguro de la razón por la que es así.

¿No podría funcionar a la inversa también, manteniendo la variable de clase en el contexto de la subclase?

Lo que también me pareció irritante fue el hecho de que el yo es siempre la subclase, incluso cuando se le llama "en" la superclase. A partir de esto, primero esperé que el código de la superclase se "ejecute en el contexto de" la subclase.

Un poco de iluminación sobre esto sería muy apreciada.

Por otro lado, es probable que tenga que aceptar que funciona de esa manera y que tengo que encontrar otra forma de hacerlo.

¿Hay una forma "meta" de hacer esto? (Lo intenté con class_variable_set etc. pero sin suerte)

¿O tal vez la idea total de ese método 'init' es errónea en primer lugar y hay algún otro "patrón" para hacer esto?

Podría hacer que @@ config sea un hash, manteniendo todas las configuraciones y siempre escogiendo la correcta, pero me parece un poco incómodo ... (¿no hay herencia para resolver este tipo de problema?

Respuestas a la pregunta(1)

Su respuesta a la pregunta