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,30 +53,36 @@ class Settingslogic &lt; Hash
53 self.update hash 53 self.update hash
54 end 54 end
55 end 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 def method_missing(name, *args, &block) 65 def method_missing(name, *args, &block)
63 if key?(name.to_s) 66 if key?(name.to_s)
64 - find_and_define name 67 + define_method_for_node_or_leaf name
65 else 68 else
66 super 69 super
67 end 70 end
68 end 71 end
69 72
70 - def find_and_define(name) 73 + def define_method_for_node_or_leaf(name)
71 if self[name.to_s].is_a? Hash 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 singleton(self).send(:define_method, name) { node } 77 singleton(self).send(:define_method, name) { node }
74 node 78 node
75 else 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 end 83 end
80 end 84 end
  85 + end
81 86
  87 + include NodeDefinder
82 end 88 end