>>>>> "t" == ts  <decoux / moulon.inra.fr> writes:

t>          class << self; self end.send(:attr_accessor, k)

 This is stupid, there is a better way

pigeon% cat b.rb
#!./ruby

class SceneObject
   def initialize(params, &generate)
      params.each do |k, v|
         k.each_with_index do |name, i|
            send("#{name}=", v[i])
         end
      end
      @generate = generate
   end
   alias init initialize

   def render
      instance_eval(&@generate)
   end
end

def defineClass(name, *var, &block)
   Object.const_set(name, Class.new(SceneObject)).instance_eval do
      var.each {|v| send(:attr_accessor, v)}
      define_method(:initialize) {|*scale| init(var => scale, &block) }
   end
end

defineClass("MyObject", "scale") do
   puts "render some object #{self.inspect}"
end

a = MyObject.new(1.5)
a.render

defineClass("MyObject2", "scale1", "scale2") do
   puts "render another object #{self.inspect}"
end

a = MyObject2.new(1.5, 3.0)
a.render
pigeon% 

pigeon% b.rb
render some object #<MyObject:0x401ab31c @generate=#<Proc:0x401ab498@./b.rb:26>, @scale=1.5>
render another object #<MyObject2:0x401aafd4 @scale1=1.5, @generate=#<Proc:0x401ab2a4@./b.rb:33>, @scale2=3.0>
pigeon% 


Guy Decoux