class Meander::Plain

Brief

This class is a sugar filled version of HashWithIndifferentAccess

It supports key-based method_name calling and value block evaluation

Configuration

You can set class that will be applied to newly assigned values

require 'active_support/core_ext/hash'
class MyClass < Meander::Plain
  cover_class = HashWithIndifferentAccess
end

m = MyClass.new
m[:a] = {}
m[:a].class # => ActiveSupport::HashWithIndifferentAccess

Usage

Key based method_name evaluation

m = Meander::Plain.new({:a => 1})
m.a # => 1

New value assignment

n = Meander::Plain.new
n.a = 1
n.a # => 1

Block values evaluation

k = Meander::Plain.new({config: nil})
k.config do |k|
  k.path = "some_config_path.yml"
end
k.config.path # => "some_config_path.yml"

Public Class Methods

new(val = {}) click to toggle source
Calls superclass method
# File lib/meander/plain.rb, line 38
def initialize(val = {})
  val ||= {}
  super(val)
end

Public Instance Methods

[]=(key, value) click to toggle source
Calls superclass method
# File lib/meander/plain.rb, line 43
def []=(key, value)
  if value.is_a?(Hash) && !value.is_a?(self.class.cover_class)
    super(key, self.class.cover_class.new(value))
  else
    super
  end
end
method_missing(method_name, *args) { |self| ... } click to toggle source
Calls superclass method
# File lib/meander/plain.rb, line 51
def method_missing(method_name, *args, &block)
  method_name = method_name.to_s
  if new_key_method? method_name
    key_name = method_name.gsub(/=$/, '')
    send :[]=, key_name, *args, &block
  elsif block_given?
    val = self[method_name]
    val = {} unless self.class.hash_or_cover_class?(val)
    send :[]=, method_name, val
    yield(self[method_name])
  elsif key?(method_name)
    self[method_name]
  else
    super
  end
end
respond_to_missing?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/meander/plain.rb, line 68
def respond_to_missing?(method_name, include_private = false)
  new_key_method?(method_name) || key?(method_name) || super
end