1414# include Rage::Events::Subscriber
1515# subscribe_to MyEvent
1616#
17- # def handle (event)
18- # puts "Handled event: #{event.inspect}"
17+ # def call (event)
18+ # puts "Received event: #{event.inspect}"
1919# end
2020# end
2121#
2222# # Publish an event
2323# Rage::Events.publish(MyEvent.new)
2424# ```
2525#
26- # When an event matching the specified class is published, the `handle ` method will be invoked with the event instance.
26+ # When an event matching the specified class is published, the `call ` method will be invoked with the event instance.
2727#
2828# You can also subscribe to multiple event classes:
2929#
3232# include Rage::Events::Subscriber
3333# subscribe_to EventA, EventB
3434#
35- # def handle (event)
35+ # def call (event)
3636# puts "Received event: #{event.inspect}"
3737# end
3838# end
4545# include Rage::Events::Subscriber
4646# subscribe_to MyEvent, deferred: true
4747#
48- # def handle (event)
48+ # def call (event)
4949# puts "Received event in background: #{event.inspect}"
5050# end
5151# end
5252# ```
5353#
5454# Such subscriber will be executed in the background using Rage's deferred task system.
5555#
56+ # You can also define custom error handling for exceptions raised during event processing using `rescue_from`:
57+ #
58+ # ```ruby
59+ # class MySubscriber
60+ # include Rage::Events::Subscriber
61+ # subscribe_to MyEvent
62+ #
63+ # rescue_from StandardError do |exception|
64+ # puts "An error occurred: #{exception.message}"
65+ # end
66+ # end
67+ # ```
68+ #
69+ # @see ClassMethods
70+ #
5671module Rage ::Events ::Subscriber
5772 def self . included ( handler_class )
5873 handler_class . extend ClassMethods
5974 end
6075
61- def handle ( _ )
76+ # @private
77+ def call ( _ )
6278 end
6379
64- def __handle ( event , metadata : nil )
80+ # @private
81+ def __call ( event , context : nil )
6582 Rage . logger . with_context ( self . class . __log_context ) do
66- metadata . nil? ? handle ( event ) : handle ( event , metadata : metadata . freeze )
83+ context . nil? ? call ( event ) : call ( event , context : context . freeze )
6784 rescue Exception => _e
6885 e = self . class . __rescue_handlers ? __run_rescue_handlers ( _e ) : _e
6986
@@ -75,8 +92,13 @@ def __handle(event, metadata: nil)
7592 end
7693
7794 module ClassMethods
95+ # @private
7896 attr_accessor :__event_classes , :__is_deferred , :__log_context , :__rescue_handlers
7997
98+ # Subscribe the class to one or more events.
99+ #
100+ # @param event_classes [Class, Array<Class>] one or more event classes to subscribe to
101+ # @param deferred [Boolean] whether to process events asynchronously
80102 def subscribe_to ( *event_classes , deferred : false )
81103 @__event_classes = ( @__event_classes || [ ] ) | event_classes
82104 @__is_deferred = !!deferred
@@ -88,10 +110,16 @@ def subscribe_to(*event_classes, deferred: false)
88110
89111 if @__is_deferred
90112 include Rage ::Deferred ::Task
91- alias_method :perform , :__handle
113+ alias_method :perform , :__call
92114 end
93115 end
94116
117+ # Define exception handlers for the subscriber.
118+ #
119+ # @param klasses [Class, Array<Class>] one or more exception classes to handle
120+ # @param with [Symbol, String] the method name to call when an exception is raised
121+ # @yield [exception] optional block to handle the exception
122+ # @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.
95123 def rescue_from ( *klasses , with : nil , &block )
96124 unless with
97125 if block_given?
@@ -116,6 +144,7 @@ def inherited(klass)
116144 klass . subscribe_to ( *@__event_classes , deferred : @__is_deferred ) if @__event_classes
117145 end
118146
147+ # @private
119148 def __register_rescue_handlers
120149 return if method_defined? ( :__run_rescue_handlers , false ) || @__rescue_handlers . nil?
121150
0 commit comments