From: Philippe Lang [mailto:philippe.lang / attiksystem.ch] > As the code suggest, what I except is: > > B class init > B instance init > 123 > 456 > B instance init > 789 > > > > In other words, the global @@dynamic_method_outputs is not > cleared between D1 and D2 class definitions. Class variables are shared between a class and all its subclasses. You want an instance variable of the class itself: class B puts "B class init" def self.dynamic_method_outputs @dynamic_method_outputs ||= [] end def initialize puts "B instance init" end def self.add_to_dynamic_method_output(val) dynamic_method_outputs << val method_def = "def dynamic_method() " dynamic_method_outputs.each do |v| method_def << "puts #{v} \n" end method_def << "end" self.class_eval method_def end end class D1 < B add_to_dynamic_method_output 123 add_to_dynamic_method_output 456 end class D2 < B add_to_dynamic_method_output 789 end d1 = D1.new d1.dynamic_method d2 = D2.new d2.dynamic_method #=> B class init #=> B instance init #=> 123 #=> 456 #=> B instance init #=> 789