module Rage::Events::Subscriber::ClassMethods
def deferred?
-
(Boolean)- `true` if the subscriber is deferred, `false` otherwise
def deferred? @__is_deferred end
def inherited(klass)
- 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)
- 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)
-
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