class HandyHash

Constants

VERSION

Public Class Methods

new(value=nil) click to toggle source
# File lib/handy_hash.rb, line 8
def initialize(value=nil)
  if value
    value.each do |k, v|
      self[k] = __wrap v
    end
  end
end

Private Class Methods

Nil() click to toggle source
# File lib/handy_hash.rb, line 64
def Nil
  @Nil ||= new.tap(&:freeze)
end

Public Instance Methods

[]=(k,v) click to toggle source
Calls superclass method
# File lib/handy_hash.rb, line 21
def []=(k,v)
  super k, __wrap(v)
end
freeze() click to toggle source
Calls superclass method
# File lib/handy_hash.rb, line 16
def freeze
  super
  each{|_, v| v.freeze unless v.frozen?}
end
method_missing(m, *args, &block) click to toggle source
Calls superclass method
# File lib/handy_hash.rb, line 33
def method_missing(m, *args, &block)
  if m =~ /\Ato_ary\Z/ || m =~ /\=$/ || args.size > 1 || block_given?
    super
  else
    m = m.to_s
    if m[-1] == '!'
      m = m.to_s.sub!(/!$/, '')
      required = true
    end
    if m =~ /\A_(.+)_\Z/
      m = $1 
    end
    __fetch_value m, required: required, default: args.first
  end
end
patch(hash=nil, &block) click to toggle source
# File lib/handy_hash.rb, line 25
def patch(hash=nil, &block)
  change_set = [].tap do |ch|
    ch << __wrap(hash) if hash
    ch << Builder.new(&block).data if block_given?
  end
  Patch.(self, *change_set)
end

Private Instance Methods

__fetch_value(key, required: false, default: nil) click to toggle source
# File lib/handy_hash.rb, line 51
def __fetch_value(key, required: false, default: nil)
  unless self[key].nil?
    self[key]
  else
    default || (required ? raise(ValueMissingError, "value missing: \"#{key}\"") : HandyHash.Nil)
  end
end
__wrap(v) click to toggle source
# File lib/handy_hash.rb, line 59
def __wrap(v)
  v.kind_of?(Hash) && !v.kind_of?(HandyHash) ? HandyHash.new(v) : v
end