require 'lotus/action/rack'
require 'lotus/action/mime'
require 'lotus/action/redirect'
require 'lotus/action/exposable'
require 'lotus/action/throwable'
require 'lotus/action/callbacks'
require 'lotus/action/callable'

module Lotus
  # An HTTP endpoint
  #
  # @since 0.1.0
  #
  # @example
  #   require 'lotus/controller'
  #
  #   class Show
  #     include Lotus::Action
  #
  #     def call(params)
  #       # ...
  #     end
  #   end
  module Action
    def self.included(base)
      base.class_eval do
        include Rack
        include Mime
        include Redirect
        include Exposable
        include Throwable
        include Callbacks
        prepend Callable
      end
    end

    protected

    # Finalize the response
    #
    # This method is abstract and COULD be implemented by included modules in
    # order to prepare their data before the reponse will be returned to the
    # webserver.
    #
    # @since 0.1.0
    # @api private
    # @abstract
    #
    # @see Lotus::Action::Mime
    # @see Lotus::Action::Cookies
    # @see Lotus::Action::Callable
    def finish
    end
  end
end