class Slack::Notifier::PayloadMiddleware::Stack

def as_array args

def as_array args
  if args.respond_to?(:to_ary)
    args.to_ary
  else
    [args]
  end
end

def call payload={}

def call payload={}
  result = stack.inject payload do |pld, middleware|
    as_array(pld).flat_map do |p|
      middleware.call(p)
    end
  end
  as_array(result)
end

def initialize notifier

def initialize notifier
  @notifier = notifier
  @stack    = []
end

def set *middlewares

def set *middlewares
  middlewares =
    if middlewares.length == 1 && middlewares.first.is_a?(Hash)
      middlewares.first
    else
      middlewares.flatten
    end
  @stack = middlewares.map do |key, opts|
    PayloadMiddleware.registry.fetch(key).new(*[notifier, opts].compact)
  end
end