class Psych::Visitors::ToRuby

def deserialize o

def deserialize o
  if klass = resolve_class(Psych.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'
    class_loader.big_decimal._load o.value
  when "!ruby/object:DateTime"
    class_loader.date_time
    require 'date'
    @ss.parse_time(o.value).to_datetime
  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
    o.value =~ /^\/(.*)\/([mixn]*)$/
    source  = $1
    options = 0
    lang    = nil
    ($2 || '').split('').each 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