class Spree::Event::SubscriberRegistry
Attributes
registry[R]
Public Class Methods
new()
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 6 def initialize @registry = {} @semaphore = Mutex.new end
Public Instance Methods
activate_all_subscribers()
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 20 def activate_all_subscribers registry.each_key { |subscriber_name| activate_subscriber(subscriber_name.constantize) } end
activate_autoloadable_subscribers()
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 15 def activate_autoloadable_subscribers require_subscriber_files activate_all_subscribers end
activate_subscriber(subscriber)
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 28 def activate_subscriber(subscriber) return unless registry[subscriber.name] subscriber.event_actions.each do |event_action, event_name| @semaphore.synchronize do unsafe_deactivate_subscriber(subscriber, event_action) subscription = Spree::Event.subscribe(event_name) { |event| subscriber.send(event_action, event) } # deprecated mappings, to be removed when Solidus 2.10 is not supported anymore: if subscriber.respond_to?("#{event_action}_handler=") subscriber.send("#{event_action}_handler=", subscription) end registry[subscriber.name][event_action] = subscription end end end
deactivate_all_subscribers()
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 24 def deactivate_all_subscribers registry.each_key { |subscriber_name| deactivate_subscriber(subscriber_name.constantize) } end
deactivate_subscriber(subscriber, event_action_name = nil)
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 47 def deactivate_subscriber(subscriber, event_action_name = nil) @semaphore.synchronize do unsafe_deactivate_subscriber(subscriber, event_action_name) end end
register(subscriber)
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 11 def register(subscriber) registry[subscriber.name] ||= {} end
Private Instance Methods
require_subscriber_files()
click to toggle source
Loads all Solidus' core and application's event subscribers files. The latter are loaded automatically only when the preference Spree::Config.events.autoload_subscribers is set to a truthy value.
Files must be placed under the directory `app/subscribers` and their name must end with `_subscriber.rb`.
Loading the files has the side effect of adding their module to the list in Spree::Event.subscribers.
# File lib/spree/event/subscriber_registry.rb, line 66 def require_subscriber_files pattern = "app/subscribers/**/*_subscriber.rb" # Load Solidus subscribers # rubocop:disable Rails/DynamicFindBy solidus_core_dir = Gem::Specification.find_by_name('solidus_core').gem_dir # rubocop:enable Rails/DynamicFindBy Dir.glob(File.join(solidus_core_dir, pattern)) { |c| require_dependency(c.to_s) } # Load application subscribers, only when the flag is set to true: if Spree::Config.events.autoload_subscribers Rails.root.glob(pattern) { |c| require_dependency(c.to_s) } end end
unsafe_deactivate_subscriber(subscriber, event_action_name = nil)
click to toggle source
# File lib/spree/event/subscriber_registry.rb, line 81 def unsafe_deactivate_subscriber(subscriber, event_action_name = nil) to_unsubscribe = Array.wrap(event_action_name || subscriber.event_actions.keys) to_unsubscribe.each do |event_action| if (subscription = registry.dig(subscriber.name, event_action)) Spree::Event.unsubscribe(subscription) registry[subscriber.name].delete(event_action) end end end