En mi post anterior sobre evitar conflitos de nombres con mixins utilicé una clase auxiliar que incluía el módulo que queriamos, tras lo cual era instanciada para tener accesibles los métodos del módulo.

En el último ejemplo del post propuse el siguiente código:

module Validable
  def valid?
    check
  end
  def check
    true
  end
end

class Ejemplo4
  # clase auxiliar que incluye la funcionalidad de Validable
  class ValidableHelper
    include Validable
  end
  def check
    if ValidableHelper.new.valid?
      "Valid"
    else
      "Invalid"
    end
  end
end

>> Ejemplo4.new.check
=> "Valid"

Utilizamos la clase ValidableHelper para encapsular el módulo Validable y que los métodos de éste no interfieran con el resto de métodos de nuestra clase.

Podemos evitar tener que instanciar nuestra clase auxiliar extendiendo el módulo en lugar de incluirlo, para que sus métodos sean métodos de clase y no de instancia.

module Validable
  def valid?
    check
  end
  def check
    true
  end
end

class Ejemplo4
  # clase auxiliar que incluye la funcionalidad de Validable
  class ValidableHelper
    extend Validable
  end
  def check
    if ValidableHelper.valid?
      "Valid"
    else
      "Invalid"
    end
  end
end

>> Ejemplo4.new.check
=> "Valid"

También podemos usar un módulo auxiliar para conseguir el mismo efecto:

module Validable
  def valid?
    check
  end
  def check
    true
  end
end

class Ejemplo4
  # clase auxiliar que incluye la funcionalidad de Validable
  module ValidableHelper
    extend Validable
  end
  def check
    if ValidableHelper.valid?
      "Valid"
    else
      "Invalid"
    end
  end
end

>> Ejemplo4.new.check
=> "Valid"