module Chickpea

Constants

VERSION

Public Class Methods

check_type(obj, nv) click to toggle source
# File lib/chickpea.rb, line 24
def check_type(obj, nv)
  case obj
  when true, false
    unless nv == true || nv == false
      raise(TypeError.new(nv, :Boolean))
    end
  else
    unless nv.is_a?(obj.class)
      raise(TypeError.new(nv, obj.class.name))
    end
  end
end
def_accessors(klass, key, nv) click to toggle source
# File lib/chickpea.rb, line 11
def def_accessors(klass, key, nv)
  (
    case nv
    when true, false
      [[:"#{key}?", -> { nv }]]
    else
      []
    end + [[:"#{key}", -> { nv }]]
  ).each do |(meth, block)|
    klass.define_method(meth, &block)
  end
end
make_stash(hash) click to toggle source
# File lib/chickpea.rb, line 37
def make_stash(hash)
  klass = Class.new

  hash.each do |key, val|
    obj =
      if val.is_a?(Hash)
        make_stash(val)
      else
        klass.define_method(:"#{key}=") do |nv|
          Chickpea.check_type(val, nv)

          Chickpea.def_accessors(klass, key, nv)
        end

        val
      end

    Chickpea.def_accessors(klass, key, obj)
  end

  klass.define_method(:to_h) do
    hash.map do |k, v|
      [k, send(k).then { |r| v.is_a?(Hash) ? r.to_h : r }]
    end.to_h
  end

  klass.define_method(:merge!) do |hash|
    hash.each do |k, v|
      v.is_a?(Hash) ? send(k).merge!(v) : send(:"#{k}=", v)
    end
  end

  klass.new
end
Also aliased as: new
new(hash)
Alias for: make_stash