module Rage::Events::Subscriber::ClassMethods

def deferred?

Returns:
  • (Boolean) - `true` if the subscriber is deferred, `false` otherwise
def deferred?
  @__is_deferred
end

def inherited(klass)

Other tags:
    Private: -
def inherited(klass)
  klass.__rescue_handlers = @__rescue_handlers.freeze
  klass.subscribe_to(*@__event_classes, deferred: @__is_deferred) if @__event_classes
end

def rebuild_exception_handler!

def rebuild_exception_handler!
  rescue_calls = @__rescue_handlers.map do |klasses, handler|
    <<~RUBY
      rescue #{klasses.join(", ")} => e
        method(:#{handler}).arity == 0 ? #{handler} : #{handler}(e)
    RUBY
  end
  class_eval <<~RUBY, __FILE__, __LINE__ + 1
    private def with_exception_handler
      yield
      #{rescue_calls.join("\n")}
    end
  RUBY
end

def rescue_from(*klasses, with: nil, &block)

Other tags:
    Note: - If you do not re-raise exceptions in deferred subscribers, the subscriber will be marked as successful and Rage will not attempt to retry it.

Other tags:
    Yield: - optional block to handle the exception

Parameters:
  • with (Symbol, String) -- the method name to call when an exception is raised
  • klasses (Class, Array) -- one or more exception classes to handle
def rescue_from(*klasses, with: nil, &block)
  unless with
    if block_given?
      with = Rage::Internal.define_dynamic_method(self, block)
    else
      raise ArgumentError, "No handler provided. Pass the `with` keyword argument or provide a block."
    end
  end
  if @__rescue_handlers.nil?
    @__rescue_handlers = []
  elsif @__rescue_handlers.frozen?
    @__rescue_handlers = @__rescue_handlers.dup
  end
  @__rescue_handlers.unshift([klasses, with])
  rebuild_exception_handler!
end

def subscribe_to(*event_classes, deferred: false)

Parameters:
  • deferred (Boolean) -- whether to process events asynchronously
  • event_classes (Class, Array) -- one or more event classes to subscribe to
def subscribe_to(*event_classes, deferred: false)
  @__event_classes = (@__event_classes || []) | event_classes
  @__is_deferred = !!deferred
  @__log_context = { subscriber: name }.freeze
  @__event_classes.each do |event_class|
    Rage::Events.__register_subscriber(event_class, self)
  end
  if @__is_deferred
    include Rage::Deferred::Task
    alias_method :perform, :__call
  end
end