def fetch(data, keys, default = nil, format = false)
    if keys.is_a?(String) || keys.is_a?(Symbol)
      keys = [ keys ]
    end

    keys = keys.flatten.compact
    key  = keys.shift

    if data.has_key?(key)
      value = data[key]

      if keys.empty?
        return filter(value, format)
      else
        return fetch(data[key], keys, default, format) if data[key].is_a?(Hash)
      end
    end
    return filter(default, format)
  end
def fetch(data, keys, default = nil, format = false)
    if keys.is_a?(String) || keys.is_a?(Symbol)
      keys = [ keys ]
    end

    keys = keys.flatten.compact
    key  = keys.shift

    if data.has_key?(key)
      value = data[key]

      if keys.empty?
        return filter(value, format)
      else
        return fetch(data[key], keys, default, format) if data[key].is_a?(Hash)
      end
    end
    return filter(default, format)
  end
Recursively fetch value for key path in the configuration object.

 This method serves as a base accessor to the properties that are defined in
 the central property collection.  It is used and built upon by other
 accessors defined in the class.

 Hash data is assumed to already be symbolized.

 * *Parameters*
   - [Hash] *data*  Configuration property data
   - [Array<String, Symbol>, String, Symbol] *keys*  Key path to fetch
   - [ANY] *default*  Default value is no value is found for key path
   - [false, Symbol, String] *format*  Format to filter final returned value or false for none

 * *Returns*
   - [ANY]  Filtered value for key path from configuration object

 * *Errors*

 See:
 - #filter
 - Nucleon::Util::Data::filter