<?xml version='1.0' encoding='UTF-8'?>
<elementos_gw>
  <documento>
    <id>968</id>
    <autor>5</autor>
    <nome>attr_reader for class variables</nome>
    <nome_facil>attr reader for class variables</nome_facil>
    <criacao>2011-03-20 14:21:04</criacao>
    <alteracao>2011-03-23 14:19:05</alteracao>
    <texto>Method 1: class_eval with string
{{{
class Class
  def _attr_reader *vars
    vars.each do |var|
      class_eval &lt;&lt;-COD
        def self.#{var}
          @@#{var}
        end
      COD
    end
  end
end
}}}

Method 2: define_method and class_variable_get
{{{
class Class
  def _attr_reader *vars
    vars.each do |var|
      self.class.send(:define_method, var) do
        class_variable_get &quot;@@#{var}&quot;
      end
    end
  end
end
}}}

Testing:
{{{
class Test
  @@foo = &#039;hihaha&#039;
  @@bar = &#039;eita&#039;
  _attr_reader :foo, :bar
end

puts Test.foo        #=&gt; hihaha
puts Test.bar        #=&gt; eita
}}}

I prefer the second way because I tend to avoid &quot;evals&quot;, due to performance issues of parsing strings. You could use class_eval with a block instead of string, but it&#039;s method 2 with more code:

Method 3: class_eval with a block
{{{
class Class
  def _attr_reader *vars
    vars.each do |var|
      class_eval do
        self.class.send(:define_method, var) do
          class_variable_get &quot;@@#{var}&quot;
        end
      end
    end
  end
end
}}}

Method 4: instance_eval:
{{{
class Class
  def _attr_reader *vars
    vars.each do |var|
      (class &lt;&lt; self; self; end).instance_eval do
        define_method(var) do
          class_variable_get &quot;@@#{var}&quot;
        end
      end
    end
  end
end
}}}
</texto>
    <publico>1</publico>
    <original>0</original>
    <anterior>0</anterior>
    <versao>0</versao>
    <traducao>0</traducao>
    <propriedade>
      <nome>language</nome>
      <valor>ruby</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>language</nome>
      <valor>English</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>categ</nome>
      <valor>Ruby experiences</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>categ</nome>
      <valor>list</valor>
      <publico>1</publico>
    </propriedade>
  </documento>
</elementos_gw>
