class ReeObject::LoadJsonDump

def call(dump)

def call(dump)
  recursively_load(dump)
end

def load_object(class_str, val)

def load_object(class_str, val)
  klass = Object.const_get(class_str)
  obj = klass.allocate
  val.each do |v|
    var = recursively_load(v[0])
    value = recursively_load(v[1])
    obj.instance_variable_set(var, value)
  end
  obj
end

def load_primitive(class_str, val)

def load_primitive(class_str, val)
  if class_str == 'Class' || class_str == 'Module'
    return Object.const_get(val)
  end
  klass = Object.const_get(class_str)
  if klass == Symbol
    val.to_sym
  elsif klass == Date
    Date.parse(val)
  elsif klass == Time
    Time.parse(val)
  elsif klass == DateTime
    DateTime.parse(val)
  elsif klass == Module || klass == Class
    klass
  else
    val
  end
end

def recursively_load(dump)

def recursively_load(dump)
  case dump['type']
  when ARRAY
    dump['value'].map { recursively_load(_1)}
  when HASH
    result = {}
    dump['value'].map do |v|
      result[recursively_load(v[0])] = recursively_load(v[1])
    end
    result
  when PRIMITIVE
    load_primitive(dump['class'], dump['value'])
  when OBJECT
    load_object(dump['class'], dump['value'])
  else
    raise NotImplementedError, "unsupported type provider '#{dump['type']}'"
  end
end