class Psych::Visitors::ToRuby

def deserialize o

def deserialize o
  if klass = resolve_class(@load_tags[o.tag])
    instance = klass.allocate
    if instance.respond_to?(:init_with)
      coder = Psych::Coder.new(o.tag)
      coder.scalar = o.value
      instance.init_with coder
    end
    return instance
  end
  return o.value if o.quoted
  return @ss.tokenize(o.value) unless o.tag
  case o.tag
  when '!binary', 'tag:yaml.org,2002:binary'
    o.value.unpack('m').first
  when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str'
    klass = resolve_class($1)
    if klass
      klass.allocate.replace o.value
    else
      o.value
    end
  when '!ruby/object:BigDecimal'
    require 'bigdecimal' unless defined? BigDecimal
    class_loader.big_decimal._load o.value
  when "!ruby/object:DateTime"
    class_loader.date_time
    t = @ss.parse_time(o.value)
    DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) +
      (t.subsec/86400)
  when '!ruby/encoding'
    ::Encoding.find o.value
  when "!ruby/object:Complex"
    class_loader.complex
    Complex(o.value)
  when "!ruby/object:Rational"
    class_loader.rational
    Rational(o.value)
  when "!ruby/class", "!ruby/module"
    resolve_class o.value
  when "tag:yaml.org,2002:float", "!float"
    Float(@ss.tokenize(o.value))
  when "!ruby/regexp"
    klass = class_loader.regexp
    matches = /^\/(?<string>.*)\/(?<options>[mixn]*)$/m.match(o.value)
    source  = matches[:string].gsub('\/', '/')
    options = 0
    lang    = nil
    matches[:options].each_char do |option|
      case option
      when 'x' then options |= Regexp::EXTENDED
      when 'i' then options |= Regexp::IGNORECASE
      when 'm' then options |= Regexp::MULTILINE
      when 'n' then options |= Regexp::NOENCODING
      else lang = option
      end
    end
    klass.new(*[source, options, lang].compact)
  when "!ruby/range"
    klass = class_loader.range
    args = o.value.split(/([.]{2,3})/, 2).map { |s|
      accept Nodes::Scalar.new(s)
    }
    args.push(args.delete_at(1) == '...')
    klass.new(*args)
  when /^!ruby\/sym(bol)?:?(.*)?$/
    class_loader.symbolize o.value
  else
    @ss.tokenize o.value
  end
end