Module: Tooled::Publisher
- Defined in:
- lib/tooled/publisher.rb
Defined Under Namespace
Modules: ClassMethods Classes: EventMissingException
Class Method Summary collapse
Instance Method Summary collapse
-
#register_subscriber(subscriber, *event_names) ⇒ Object
Registers a subscriber to an instance.
-
#subscribers ⇒ Object
Returns a complete hash of subscribers including those registered at class level.
-
#with_event(event_name, &block) ⇒ Object
Executes a provided block but calls all the events on relevant subscribers as well.
Class Method Details
.included(base) ⇒ Object
17 18 19 |
# File 'lib/tooled/publisher.rb', line 17 def self.included(base) base.extend(ClassMethods) end |
Instance Method Details
#register_subscriber(subscriber, *event_names) ⇒ Object
Registers a subscriber to an instance.
This will raise an EventMissing exception if any of the provided event
names aren't registered.
35 36 37 38 39 40 41 |
# File 'lib/tooled/publisher.rb', line 35 def register_subscriber(subscriber, *event_names) @subscribers ||= self.class.subscribers events = event_names.collect(&:to_sym).uniq invalid_events = events - self.class.publishable_events_list raise EventMissingException.new("`#{invalid_events.collect(&:to_s).join('`, `')}` are not registered events") unless invalid_events.empty? @subscribers[subscriber] = events end |
#subscribers ⇒ Object
Returns a complete hash of subscribers including those registered at
class level.
25 26 27 |
# File 'lib/tooled/publisher.rb', line 25 def subscribers (@subscribers ||= self.class.subscribers).dup end |
#with_event(event_name, &block) ⇒ Object
Executes a provided block but calls all the events on relevant subscribers
as well.
`before_event_name` -> `around_event_name` -> `around_event_name` -> `after_event_name`
49 50 51 52 53 54 55 56 |
# File 'lib/tooled/publisher.rb', line 49 def with_event(event_name, &block) raise EventMissingException.new("`#{event_name.to_s}` is not a registered event") unless self.class.publishable_events_list.include?(event_name.to_sym) subs = _subscribers_for(event_name) _broadcast(subs, ["before_#{event_name.to_s}", "around_#{event_name.to_s}"]) result = block.call if block_given? _broadcast(subs, ["around_#{event_name.to_s}", "after_#{event_name.to_s}"]) result end |