class Class

def cattr_reader(*syms)

Person.new.hair_colors # => NoMethodError

end
cattr_reader :hair_colors, instance_reader: false
class Person

or instance_accessor: false.
If you want to opt out the instance reader method, you can pass instance_reader: false

# => NameError: invalid attribute name
end
cattr_reader :"1_Badname "
class Person

The attribute name must be a valid method name in Ruby.

Person.new.hair_colors # => [:brown, :black]
Person.hair_colors # => [:brown, :black]
Person.class_variable_set("@@hair_colors", [:brown, :black])

end
cattr_reader :hair_colors
class Person

returns the attribute value.
Defines a class attribute if it's not defined and creates a reader method that
def cattr_reader(*syms)
  options = syms.extract_options!
  syms.each do |sym|
    raise NameError.new("invalid class attribute name: #{sym}") unless sym =~ /^[_A-Za-z]\w*$/
    class_eval(<<-EOS, __FILE__, __LINE__ + 1)
      unless defined? @@#{sym}
        @@#{sym} = nil
      end
      def self.#{sym}
        @@#{sym}
      end
    EOS
    unless options[:instance_reader] == false || options[:instance_accessor] == false
      class_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{sym}
          @@#{sym}
        end
      EOS
    end
  end
end