From 32542af891aacaea59f3cb7378a58c742c5fd98e Mon Sep 17 00:00:00 2001 From: Pavel Mitin Date: Wed, 2 Sep 2009 04:02:57 +0800 Subject: [PATCH] Refactoring: NodeDefinder module was introduced. --- lib/settingslogic.rb | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/settingslogic.rb b/lib/settingslogic.rb index 8aa781b..5fb93fe 100644 --- a/lib/settingslogic.rb +++ b/lib/settingslogic.rb @@ -53,30 +53,36 @@ class Settingslogic < Hash self.update hash end end - - def singleton(obj) - class << obj; self; end - end - private + module NodeDefinder + + def singleton(obj) + class << obj; self; end + end + + private + def method_missing(name, *args, &block) if key?(name.to_s) - find_and_define name + define_method_for_node_or_leaf name else super end end - def find_and_define(name) + def define_method_for_node_or_leaf(name) if self[name.to_s].is_a? Hash - node = self.class.new self[name.to_s] + node = self[name.to_s] + node.extend NodeDefinder singleton(self).send(:define_method, name) { node } node else - value = self[name.to_s] - singleton(self).send(:define_method, name) { value } - value + leaf = self[name.to_s] + singleton(self).send(:define_method, name) { leaf } + leaf end end + end + include NodeDefinder end -- libgit2 0.21.0