>>>>> "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