Ruby talk for austinonrails
<< >>
A metaprogramming solution

    class DataRecord
    
      def self.make(file_name)
        data = File.open(file_name)
        header = data.gets.chomp
        class_name = File.basename(file_name,".txt").capitalize  # "foo.txt" => "Foo"
        klass = Object.const_set(class_name,Class.new)
        klass.instance_variable_set("@file",data)
        klass.const_set(:Names,header.split(","))
    
        klass.class_eval do
          attr_accessor *klass::Names
    
          define_method(:initialize) do |*values| 
            klass::Names.each_with_index do |name,i| 
              instance_variable_set("@"+name, values[i])
            end
          end
    
          def klass.read
            array = []
            @file.each do |line| 
              line.chomp!   
              values = eval("[#{line}]")
              array << self.new(*values)
            end
            @file.close
            array
          end
    
          define_method(:inspect) do
            str = "#{self.class} object: "
            klass::Names.each {|name| str << "#{name}=#{self.send(name)} " }
            str
          end
       
          alias_method :to_s, :inspect
    
        end
        klass
      end
    
    end
    
    
    this_class = DataRecord.make("people.txt")
    list = this_class.read
    puts list
    
    that_class = DataRecord.make("places.txt")
    list = Places.read     # Note I can use this name
    puts list