| a | b |  | 
|---|
 | 0 | + | ['pp', 'yaml'].each{ |lib| require lib } | 
|---|
 | 0 | + |  | 
|---|
 | 0 | + | module YAML | 
|---|
 | 0 | + |     def save_file(filename, obj) | 
|---|
 | 0 | + |         File.open(filename, "w+"){ |file| file.puts(obj.to_yaml) } | 
|---|
 | 0 | + |         obj | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + |     module_function :save_file | 
|---|
 | 0 | + | end | 
|---|
 | 0 | + |  | 
|---|
 | 0 | + | class Hash | 
|---|
 | 0 | + |     def rename(old_key, new_key) | 
|---|
 | 0 | + |         new_hash = self.dup | 
|---|
 | 0 | + |         new_hash[new_key] = new_hash.delete(old_key) | 
|---|
 | 0 | + |         new_hash | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + |     def rename!(old_key, new_key) | 
|---|
 | 0 | + |         self[new_key] = self.delete(old_key) | 
|---|
 | 0 | + |         self | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + | end | 
|---|
 | 0 | + |  | 
|---|
 | 0 | + | class YAMLOptions | 
|---|
 | 0 | + |     attr_accessor :filename | 
|---|
 | 0 | + |     alias set instance_eval # Like Object.tap, but evals the block rather than passing self to it | 
|---|
 | 0 | + |      | 
|---|
 | 0 | + |     def initialize(filename, &blk) | 
|---|
 | 0 | + |         @filename = filename | 
|---|
 | 0 | + |         @hash = load | 
|---|
 | 0 | + |         set(&blk) if block_given? | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + |      | 
|---|
 | 0 | + |     def method_missing(method, *args, &block) | 
|---|
 | 0 | + |         p method | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + |     def save | 
|---|
 | 0 | + |         YAML.save_file(@filename, @hash) | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + |     def load | 
|---|
 | 0 | + |         YAML.load_file(@filename) rescue YAML.save_file(@filename, {}) | 
|---|
 | 0 | + |     end | 
|---|
 | 0 | + | end | 
|---|
 | 0 | + |  | 
|---|
 | 0 | + | options = YAMLOptions.new("./options.yaml") | 
|---|
 | 0 | + |  | 
|---|
 | 0 | + | options.set do | 
|---|
 | 0 | + |     foo | 
|---|
 | 0 | + |     foo = "It aint easy being cheesy!" | 
|---|
 | 0 | + | end | 
|---|
 | 0 | + | puts "#===---" | 
|---|
 | 0 | + | options.foo | 
|---|
 | 0 | + | options.foo = "It aint easy being cheesy!" | 
|---|
| ... |  | 
|---|