Commit 32542af891aacaea59f3cb7378a58c742c5fd98e

Authored by Pavel Mitin
Committed by Ben Johnson
1 parent ae0fd35f
Exists in master

Refactoring: NodeDefinder module was introduced.

Signed-off-by: Ben Johnson <bjohnson@binarylogic.com>
Showing 1 changed file with 17 additions and 11 deletions   Show diff stats
lib/settingslogic.rb
... ... @@ -53,30 +53,36 @@ class Settingslogic &lt; Hash
53 53 self.update hash
54 54 end
55 55 end
56   -
57   - def singleton(obj)
58   - class << obj; self; end
59   - end
60 56  
61   - private
  57 + module NodeDefinder
  58 +
  59 + def singleton(obj)
  60 + class << obj; self; end
  61 + end
  62 +
  63 + private
  64 +
62 65 def method_missing(name, *args, &block)
63 66 if key?(name.to_s)
64   - find_and_define name
  67 + define_method_for_node_or_leaf name
65 68 else
66 69 super
67 70 end
68 71 end
69 72  
70   - def find_and_define(name)
  73 + def define_method_for_node_or_leaf(name)
71 74 if self[name.to_s].is_a? Hash
72   - node = self.class.new self[name.to_s]
  75 + node = self[name.to_s]
  76 + node.extend NodeDefinder
73 77 singleton(self).send(:define_method, name) { node }
74 78 node
75 79 else
76   - value = self[name.to_s]
77   - singleton(self).send(:define_method, name) { value }
78   - value
  80 + leaf = self[name.to_s]
  81 + singleton(self).send(:define_method, name) { leaf }
  82 + leaf
79 83 end
80 84 end
  85 + end
81 86  
  87 + include NodeDefinder
82 88 end
... ...