require 'rest-builder'

module RestCore
  # for backward compatibility
  RestBuilder.constants.each do |const|
    const_set(const, RestBuilder.const_get(const))
  end

  # oauth1 utilities
  autoload :ClientOauth1     , 'rest-core/client_oauth1'

  # misc utilities
  autoload :Hmac             , 'rest-core/util/hmac'
  autoload :Json             , 'rest-core/util/json'
  autoload :ParseLink        , 'rest-core/util/parse_link'
  autoload :ParseQuery       , 'rest-core/util/parse_query'
  autoload :Config           , 'rest-core/util/config'
  autoload :Clash            , 'rest-core/util/clash'
  autoload :Smash            , 'rest-core/util/smash'
  autoload :DalliExtension   , 'rest-core/util/dalli_extension'

  # middlewares
  autoload :AuthBasic        , 'rest-core/middleware/auth_basic'
  autoload :Bypass           , 'rest-core/middleware/bypass'
  autoload :Cache            , 'rest-core/middleware/cache'
  autoload :ClashResponse    , 'rest-core/middleware/clash_response'
  autoload :SmashResponse    , 'rest-core/middleware/smash_response'
  autoload :CommonLogger     , 'rest-core/middleware/common_logger'
  autoload :DefaultHeaders   , 'rest-core/middleware/default_headers'
  autoload :DefaultQuery     , 'rest-core/middleware/default_query'
  autoload :DefaultPayload   , 'rest-core/middleware/default_payload'
  autoload :DefaultSite      , 'rest-core/middleware/default_site'
  autoload :Defaults         , 'rest-core/middleware/defaults'
  autoload :ErrorDetector    , 'rest-core/middleware/error_detector'
  autoload :ErrorDetectorHttp, 'rest-core/middleware/error_detector_http'
  autoload :ErrorHandler     , 'rest-core/middleware/error_handler'
  autoload :FollowRedirect   , 'rest-core/middleware/follow_redirect'
  autoload :JsonRequest      , 'rest-core/middleware/json_request'
  autoload :JsonResponse     , 'rest-core/middleware/json_response'
  autoload :QueryResponse    , 'rest-core/middleware/query_response'
  autoload :Oauth1Header     , 'rest-core/middleware/oauth1_header'
  autoload :Oauth2Header     , 'rest-core/middleware/oauth2_header'
  autoload :Oauth2Query      , 'rest-core/middleware/oauth2_query'
  autoload :Retry            , 'rest-core/middleware/retry'
  autoload :Timeout          , 'rest-core/middleware/timeout'

  # clients
  autoload :Universal        , 'rest-core/client/universal'

  # You might want to call this before launching your application in a
  # threaded environment to avoid thread-safety issue in autoload.
  def self.eagerload const=self, loaded={}
    return if loaded[const.name]
    loaded[const.name] = true
    const.constants(false).each{ |n|
      begin
        c = const.const_get(n)
      rescue LoadError, NameError => e
        warn "RestCore: WARN: #{e} for #{const}\n" \
             "  from #{e.backtrace.grep(/top.+required/).first}"
      end
      eagerload(c, loaded) if c.respond_to?(:constants) && !loaded[n]
    }
  end
end

RC = RestCore unless Object.const_defined?(:RC)