['pp', 'yaml'].each{ |lib| require lib }

module YAML
    def save_file(filename, obj)
        File.open(filename, "w+"){ |file| file.puts(obj.to_yaml) }
        obj
    end
    module_function :save_file
end

class Hash
    def rename(old_key, new_key)
        new_hash = self.dup
        new_hash[new_key] = new_hash.delete(old_key)
        new_hash
    end
    def rename!(old_key, new_key)
        self[new_key] = self.delete(old_key)
        self
    end
end

class YAMLOptions
    attr_accessor :filename
    alias set instance_eval # Like Object.tap, but evals the block rather than passing self to it
    
    def initialize(filename, &blk)
        @filename = filename
        @hash = load
        set(&blk) if block_given?
    end
    
    def method_missing(method, *args, &block)
        p method
    end
    def save
        YAML.save_file(@filename, @hash)
    end
    def load
        YAML.load_file(@filename) rescue YAML.save_file(@filename, {})
    end
end

options = YAMLOptions.new("./options.yaml")

options.set do
    foo
    foo = "It aint easy being cheesy!"
end
puts "#===---"
options.foo
options.foo = "It aint easy being cheesy!"