Class: Hashr

Inherits:
Hash show all
Defined in:
lib/hashr.rb,
lib/hashr/version.rb,
lib/hashr/env_defaults.rb

Defined Under Namespace

Modules: EnvDefaults

Constant Summary collapse

TEMPLATE =
new
VERSION =
'0.0.15'

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Hash

#deep_merge, #deep_symbolize_keys, #except, #slice

Constructor Details

#initialize(data = {}, definition = self.class.definition, &block) ⇒ Hashr

Returns a new instance of Hashr.



38
39
40
41
42
# File 'lib/hashr.rb', line 38

def initialize(data = {}, definition = self.class.definition, &block)
  replace((deep_hashrize(definition.deep_merge((data || {}).deep_symbolize_keys))))
  deep_defaultize(self)
  (class << self; self; end).class_eval(&block) if block_given?
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/hashr.rb', line 56

def method_missing(name, *args, &block)
  case name.to_s[-1, 1]
  when '?'
    !!self[name.to_s[0..-2].to_sym]
  when '='
    self[name.to_s[0..-2].to_sym] = args.first
  else
    raise(IndexError.new("Key #{name.inspect} is not defined.")) if !key?(name) && self.class.raise_missing_keys
    self[name]
  end
end

Class Attribute Details

.raise_missing_keysObject

Returns the value of attribute raise_missing_keys.



9
10
11
# File 'lib/hashr.rb', line 9

def raise_missing_keys
  @raise_missing_keys
end

Class Method Details

.deep_accessorize(hash) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/hashr.rb', line 27

def deep_accessorize(hash)
  hash.each do |key, value|
    next unless value.is_a?(Hash)
    value[:_access] ||= []
    value[:_access] = Array(value[:_access])
    value.keys.each { |key| value[:_access] << key if value.respond_to?(key) }
    deep_accessorize(value)
  end
end

.default(defaults) ⇒ Object



19
20
21
# File 'lib/hashr.rb', line 19

def default(defaults)
  @defaults = deep_accessorize(defaults)
end

.defaultsObject



23
24
25
# File 'lib/hashr.rb', line 23

def defaults
  @defaults ||= {}
end

.define(definition) ⇒ Object



11
12
13
# File 'lib/hashr.rb', line 11

def define(definition)
  @definition = deep_accessorize(definition.deep_symbolize_keys)
end

.definitionObject



15
16
17
# File 'lib/hashr.rb', line 15

def definition
  @definition ||= {}
end

Instance Method Details

#[](key) ⇒ Object



44
45
46
# File 'lib/hashr.rb', line 44

def [](key)
  super(key.to_sym)
end

#[]=(key, value) ⇒ Object



48
49
50
# File 'lib/hashr.rb', line 48

def []=(key, value)
  super(key, value.is_a?(Hash) ? self.class.new(value, {}) : value)
end

#include_accessors(accessors) ⇒ Object



72
73
74
# File 'lib/hashr.rb', line 72

def include_accessors(accessors)
  Array(accessors).each { |accessor| meta_class.send(:define_method, accessor) { self[accessor] } } if accessors
end

#include_modules(modules) ⇒ Object



68
69
70
# File 'lib/hashr.rb', line 68

def include_modules(modules)
  Array(modules).each { |mod| meta_class.send(:include, mod) } if modules
end

#meta_classObject



76
77
78
# File 'lib/hashr.rb', line 76

def meta_class
  class << self; self end
end

#respond_to?(name) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/hashr.rb', line 52

def respond_to?(name)
  true
end