module Logger extend self attr_accessor :output def log(&event) self.output ||= [] event.call(output) end def play puts output.join("\n") end end class Thing def initialize(id) Logger.log { |output| output << "created thing #{id}" } end end def do_something 1000.times { |i| Thing.new(i) } end do_something GC.start Logger.play puts ObjectSpace.each_object(Thing).count