module Concurrent::ReInclude

def extended(base)

@!visibility private
def extended(base)
  (@re_include_to_bases ||= []) << [:extend, base]
  super(base)
end

def include(*modules)

@!visibility private
def include(*modules)
  result = super(*modules)
  modules.reverse.each do |module_being_included|
    (@re_include_to_bases ||= []).each do |method, mod|
      mod.send method, module_being_included
    end
  end
  result
end

def included(base)

@!visibility private
def included(base)
  (@re_include_to_bases ||= []) << [:include, base]
  super(base)
end