module DSLKit::ThreadGlobal

def thread_global(name, default_value = nil)

value _value_ is given, it is used to initialize the variable.
Define a thread global variable named _name_ in this module/class. If the
def thread_global(name, default_value = nil)
  is_a?(Module) or raise TypeError, "receiver has to be a Module"
  name = name.to_s
  var_name = "@__#{name}_#{__id__.abs}__"
  lock = Mutex.new
  modul = self
  define_method(name) do
    lock.synchronize { modul.instance_variable_get var_name }
  end
  define_method(name + "=") do |value|
    lock.synchronize { modul.instance_variable_set var_name, value }
  end
  modul.instance_variable_set var_name, default_value if default_value
  self
end