class APIHub::Mash
Public Class Methods
# File lib/apihub/mash.rb, line 3 def self.new(value = nil, *args) if value.respond_to?(:each) && !value.respond_to?(:each_pair) value.map {|v| super(v) } else super end end
# File lib/apihub/mash.rb, line 14 def initialize(source_hash = nil, default = nil, &blk) deep_update(source_hash.to_hash) if source_hash default ? super(default) : super(&blk) end
Public Instance Methods
Retrieves an attribute set in the Mash
. Will convert any key passed in to a string before retrieving.
# File lib/apihub/mash.rb, line 34 def custom_reader(key) value = regular_reader(convert_key(key)) yield value if block_given? value end
Performs a deep_update
on a duplicate of the current mash.
# File lib/apihub/mash.rb, line 92 def deep_merge(other_hash, &blk) dup.deep_update(other_hash, &blk) end
Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.
# File lib/apihub/mash.rb, line 99 def deep_update(other_hash, &blk) other_hash.each_pair do |k,v| key = convert_key(k) if regular_reader(key).is_a?(Mash) and v.is_a?(::Hash) custom_reader(key).deep_update(v, &blk) else value = convert_value(v, true) value = blk.call(key, self[k], value) if blk custom_writer(key, value) end end self end
# File lib/apihub/mash.rb, line 73 def delete(key) super(convert_key(key)) end
Duplicates the current mash as a new mash.
# File lib/apihub/mash.rb, line 79 def dup self.class.new(self, self.default) end
# File lib/apihub/mash.rb, line 69 def fetch(key, *args) super(convert_key(key), *args) end
This is the bang method reader, it will return a new Mash
if there isn’t a value already assigned to the key requested.
# File lib/apihub/mash.rb, line 52 def initializing_reader(key) ck = convert_key(key) regular_writer(ck, self.class.new) unless key?(ck) regular_reader(ck) end
# File lib/apihub/mash.rb, line 83 def key?(key) super(convert_key(key)) end
# File lib/apihub/mash.rb, line 143 def method_missing(method_name, *args, &blk) return self.[](method_name, &blk) if key?(method_name) match = method_name.to_s.match(/(.*?)([?=!_]?)$/) case match[2] when "=" self[match[1]] = args.first when "?" !!self[match[1]] when "!" initializing_reader(match[1]) when "_" underbang_reader(match[1]) else default(method_name, *args, &blk) end end
# File lib/apihub/mash.rb, line 130 def replace(other_hash) (keys - other_hash.keys).each { |key| delete(key) } other_hash.each { |key, value| self[key] = value } self end
Will return true if the Mash
has had a key set in addition to normal respond_to? functionality.
# File lib/apihub/mash.rb, line 138 def respond_to?(method_name, include_private=false) return true if key?(method_name) || method_name.to_s.slice(/[=?!_]\Z/) super end
Performs a shallow_update
on a duplicate of the current mash
# File lib/apihub/mash.rb, line 117 def shallow_merge(other_hash) dup.shallow_update(other_hash) end
Merges (non-recursively) the hash from the argument, changing the receiving hash
# File lib/apihub/mash.rb, line 123 def shallow_update(other_hash) other_hash.each_pair do |k,v| regular_writer(convert_key(k), convert_value(v, true)) end self end
This is the under bang method reader, it will return a temporary new Mash
if there isn’t a value already assigned to the key requested.
# File lib/apihub/mash.rb, line 60 def underbang_reader(key) ck = convert_key(key) if key?(ck) regular_reader(ck) else self.class.new end end