Module: Tooled::Publisher

Defined in:
lib/tooled/publisher.rb

Defined Under Namespace

Modules: ClassMethods Classes: EventMissingException

Class Method Summary collapse

Instance Method Summary collapse

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

#subscribersObject

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