Commit 32542af891aacaea59f3cb7378a58c742c5fd98e
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 < Hash | @@ -53,30 +53,36 @@ class Settingslogic < 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 |