def wrap(m)
  Module.new{
    include m
    def foo
      super * 3
    end
  }
end

module A
  def foo
    "Hello!"
  end
end

wrap_proc = proc{|m|
  Module.new{include m; def foo; super*3; end}
}

#mod = [wrap(A),wrap(A)]   # error
mod = [wrap(Module.new),wrap(Module.new)]
mod = [wrap(Module.new),wrap(Module.new)]
mod.each{|m|
  p Class.new{ include m }.new.foo
}

# mod = [wrap(A),wrap(A)]             # error
# mod = [wrap(A),A,wrap(A)]           # error
# mod = [wrap_proc[A], wrap_proc[A] ] # error
# mod = [wrap(A), wrap(A.dup)]        # error, also for passing A2 with A2 a copy-paste of A
# mod = [wrap(Module.new),wrap(Module.new)] # SystemStackError(!), not "no superclass method" as with only a single element

# mod = [wrap_proc[A], wrap(A) ] # no error
# mod = [A,wrap(A)]         # no error
# mod = [wrap(A),A]         # no error
# mod = [A,A,wrap(A)]       # no error
# mod = [wrap(A),A,Module.new{include A}] # no error
# mod = [wrap(A),A,Module.new{include A; def foo; super*3; end}] # no error



