require 'resourceful/builder'

module Resourceful
  module Default
    # This module is mostly meant to be used by the make_resourceful default actions.
    # It provides various methods that declare where callbacks set in the +make_resourceful+ block,
    # like Builder#before and Builder#response_for,
    # should be called.
    module Callbacks
      # Calls any +before+ callbacks set in the +make_resourceful+ block for the given event.
      def before(event)
        resourceful_fire(:before, event.to_sym)
      end

      # Calls any +after+ callbacks set in the +make_resourceful+ block for the given event.
      def after(event)
        resourceful_fire(:after, event.to_sym)
      end

      # Calls any +response_for+ callbacks set in the +make_resourceful+ block for the given event.
      # Note that these aren't called directly,
      # but instead passed along to Rails' respond_to method.
      def response_for(event)
        if responses = self.class.resourceful_responses[event.to_sym]
          respond_to do |format|
            responses.each do |key, value|
              format.send(key, &scope(value))
            end
          end
        end
      end

      # Returns a block identical to the given block,
      # but in the context of the current controller.
      # The returned block accepts no arguments,
      # even if the given block accepted them.
      def scope(block)
        proc do
          instance_eval(&(block || proc {}))
        end
      end

      private

      def resourceful_fire(type, name)
        callbacks = self.class.resourceful_callbacks[type][name] || []
        callbacks.each { |callback| scope(callback).call }
      end
    end
  end
end
