Sha256: c3c93837ff7d3a1dc95e8662e852278e42dbf6fd70b306ec04dd21d10476a740

Contents?: true

Size: 869 Bytes

Versions: 1

Compression:

Stored size: 869 Bytes

Contents

class Hash
  class << self
    attr_accessor :use_dot_syntax
  end

  attr_accessor :use_dot_syntax

  def to_dot
    dotify_hash(self)

    self
  end

  def method_missing(method, *args)
    return super(method, *args) unless to_dot?

    prop = create_prop(method)

    if self[prop].nil?
      self[prop] = self.delete(prop.to_s)
    end

    super(method, args) and return if self[prop].nil?

    if setter?(method)
      self[prop] = args.first
    else
      self[prop]
    end
  end

  private def dotify_hash(hash)
    hash.use_dot_syntax = true

    hash.keys.each { |key| dotify_hash(hash[key]) if hash[key].is_a?(Hash) }
  end

  private def to_dot?
    self.use_dot_syntax || self.class.use_dot_syntax
  end

  private def setter?(method)
    method.last == "="
  end

  private def create_prop(method)
    setter?(method) ? method.chop : method
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hash_dot-2.0.0 lib/hash.rb