def method_missing(method, *args, &block)
      _, key, type = *method.to_s.match(/(?<key>\w+)(?<type>[?=]{0,1})/)

      key = key.to_sym

      if block_given?
        if @table[key]
          settings = @table[key]
        else
          settings = Settings.new(@path ? "#{@path}.#{key}" : key, self)

          set_value(key, settings)

          @children << settings
        end

        get_value(key, &block)
      elsif args.count == 1
        set_value(key, args.pop)
      elsif type == '?'
        !!get_value(key)
      else
        value = get_value(key)

        if value.nil?
          raise MissingSettingError.new("Missing setting '#{key}' in '#{@path}'.")
        end

        value
      end
    end
def method_missing(method, *args, &block)
      _, key, type = *method.to_s.match(/(?<key>\w+)(?<type>[?=]{0,1})/)

      key = key.to_sym

      if block_given?
        if @table[key]
          settings = @table[key]
        else
          settings = Settings.new(@path ? "#{@path}.#{key}" : key, self)

          set_value(key, settings)

          @children << settings
        end

        get_value(key, &block)
      elsif args.count == 1
        set_value(key, args.pop)
      elsif type == '?'
        !!get_value(key)
      else
        value = get_value(key)

        if value.nil?
          raise MissingSettingError.new("Missing setting '#{key}' in '#{@path}'.")
        end

        value
      end
    end
Creates new settings with +path+ and +parent+.
 For top level settings (usually namespace), the is no +parent+ or +path+ specified.

 Handles settting of values.

 == Examples
 Setting a value:
   .value = 2
   .value   2

 Getting a value:
   .value # => 2

 Checking a value:
   .value? # => true

 If block provided, it yields +key+ as parent.

   .value do |value|
     ...
   end

   .value do
     ...
   end