lib/reactor/models/concerns/subscribable.rb in reactor-0.5.1 vs lib/reactor/models/concerns/subscribable.rb in reactor-0.5.2

- old
+ new

@@ -1,11 +1,40 @@ module Reactor::Subscribable extend ActiveSupport::Concern module ClassMethods def on_event(event, method = nil, options = {}, &block) - callback = {method: (method || block), options: {delay: 0}.merge(options)} - callback.merge!(source: self) if method.is_a? Symbol - (Reactor::SUBSCRIBERS[event.to_s] ||= []).push(callback) + (Reactor::SUBSCRIBERS[event.to_s] ||= []).push(StaticSubscriberFactory.create event, method, {source: self}.merge(options), &block) + end + end + + class StaticSubscriberFactory + + def self.create(event, method = nil, options = {}, &block) + handler_class_prefix = event == '*' ? 'Wildcard': event.to_s.camelize + new_class = "Reactor::StaticSubscribers::#{handler_class_prefix}Handler#{Reactor::SUBSCRIBERS[event.to_s].size}" + + eval %Q{ + class #{new_class} + include Sidekiq::Worker + + cattr_accessor :method, :delay, :source + + def perform(data) + event = Reactor::Event.new(data) + if @@method.is_a?(Symbol) + @@source.delay_for(@@delay).send(@@method, event) + else + @@method.call(event) + end + end + end + } + + new_class = new_class.constantize + new_class.method = method || block + new_class.delay = options[:delay] || 0 + new_class.source = options[:source] + new_class end end end \ No newline at end of file