class Slack::Notifier

def config

def config
  @_config ||= Config.new
end

def initialize webhook_url, options={}, &block

def initialize webhook_url, options={}, &block
  @endpoint = URI.parse webhook_url
  config.http_client(options.delete(:http_client)) if options.key?(:http_client)
  config.defaults options
  config.instance_exec(&block) if block_given?
  middleware.set config.middleware
end

def middleware

def middleware
  @middleware ||= PayloadMiddleware::Stack.new(self)
end

def ping message, options={}

def ping message, options={}
  if message.is_a?(Hash)
    options = message
  else
    options[:text] = message
  end
  post options
end

def post payload={}

def post payload={}
  params  = {}
  client  = payload.delete(:http_client) || config.http_client
  payload = config.defaults.merge(payload)
  params[:http_options] = payload.delete(:http_options) if payload.key?(:http_options)
  middleware.call(payload).map do |pld|
    params[:payload] = pld.to_json
    client.post endpoint, params
  end
end