def process( args = {} )
      
      config_from_file = {}
      if args[:config_file]
        config_from_file = load_from_config(args[:config_file])
        args.delete(:config_file)
      end
      
      missing = []
      struct.members.each do |item|
        struct[item] = args[item] || ENV[(prepend + item.to_s).upcase] || config_from_file[item] || nil
        missing << item if (struct[item].nil? && required.include?(item))
      end
      raise "Missing configuration: " + missing.join( ", ") if missing.any?
    end
def process( args = {} )
      
      config_from_file = {}
      if args[:config_file]
        config_from_file = load_from_config(args[:config_file])
        args.delete(:config_file)
      end
      
      missing = []
      struct.members.each do |item|
        struct[item] = args[item] || ENV[(prepend + item.to_s).upcase] || config_from_file[item] || nil
        missing << item if (struct[item].nil? && required.include?(item))
      end
      raise "Missing configuration: " + missing.join( ", ") if missing.any?
    end
Load in config -- this can come from three places:
 1. Arguments passed to the initializer
 2. From environment variables
 3. From a config file