class Celluloid::Notifications::Fanout
def initialize
def initialize @subscribers = [] @listeners_for = {} end
def listeners_for(pattern)
def listeners_for(pattern) @listeners_for[pattern] ||= @subscribers.select { |s| s.subscribed_to?(pattern) } end
def listening?(pattern)
def listening?(pattern) listeners_for(pattern).any? end
def prune(actor, _reason = nil)
def prune(actor, _reason = nil) @subscribers.reject! { |s| s.actor == actor } @listeners_for.clear end
def publish(pattern, *args)
def publish(pattern, *args) listeners_for(pattern).each { |s| s.publish(pattern, *args) } end
def subscribe(actor, pattern, method)
def subscribe(actor, pattern, method) subscriber = Subscriber.new(actor, pattern, method).tap do |s| @subscribers << s end link actor @listeners_for.clear subscriber end
def unsubscribe(subscriber)
def unsubscribe(subscriber) @subscribers.reject! { |s| s.matches?(subscriber) } @listeners_for.clear end