Class: Announcer::Instance

Inherits:
Object
  • Object
show all
Includes:
Mixins::Serializable, Plugins::ComponentMixin
Defined in:
lib/announcer/instance.rb

Overview

Instance

Represents an instance of the Announcer. Allows multiple Instances to be created with separate configuration, subscriptions, etc. Primarily intended to help testing, but there are practical use-cases as well.

Constant Summary

Constants included from Mixins::Serializable

Mixins::Serializable::MAGIC, Mixins::Serializable::VERSION

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixins::Serializable

#_serializable_args, #_serializable_package, #_serialize_arg, included, #serialize

Constructor Details

#initialize(name = nil) ⇒ Instance

Returns a new instance of Instance.



26
27
28
29
30
31
32
33
# File 'lib/announcer/instance.rb', line 26

def initialize(name=nil)
  if name
    @name = name.to_sym
    Announcer._register_instance(self) if @name
  end

  _load_default_config
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



23
24
25
# File 'lib/announcer/instance.rb', line 23

def name
  @name
end

#publishersObject (readonly)

Returns the value of attribute publishers.



24
25
26
# File 'lib/announcer/instance.rb', line 24

def publishers
  @publishers
end

Class Method Details

.load_from_serialized(name) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/announcer/instance.rb', line 35

def self.load_from_serialized(name)
  if name
    Announcer.instance(name)
  else
    raise Errors::InstanceError, "Can't deserialize an unnamed Instance"
  end
end

Instance Method Details

#_register_subscription(subscription) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/announcer/instance.rb', line 83

def _register_subscription(subscription)
  if _subscriptions_by_identifiers[subscription.identifier]
    # This is not expected to occur
    raise Errors::SubscriptionError, "duplicate identifier: #{subscription.identifier.inspect}"
  else
    _subscriptions_by_identifiers[subscription.identifier] = subscription
 end

  _registered_subscriptions_to(subscription.event_name)
    .push(subscription)
    .sort! { |x, y| x.priority <=> y.priority }
end

#config(&block) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/announcer/instance.rb', line 43

def config(&block)
  (@__config ||= Config.new).tap { |config|
    if block_given?
      config.define(&block)
      _process_config
    end
  }
end

#find_publisher(publisher) ⇒ Object



74
75
76
77
# File 'lib/announcer/instance.rb', line 74

def find_publisher(publisher)
  klass = Publishers.load(publisher)
  publishers && publishers.find { |pub| pub.is_a?(klass) }
end

#find_subscription(identifier) ⇒ Object



70
71
72
# File 'lib/announcer/instance.rb', line 70

def find_subscription(identifier)
  _subscriptions_by_identifiers[identifier]
end

#has_publisher?(publisher) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/announcer/instance.rb', line 79

def has_publisher?(publisher)
  !!find_publisher(publisher)
end

#plugin(*args) ⇒ Object



52
53
54
# File 'lib/announcer/instance.rb', line 52

def plugin(*args)
  config { plugin(*args) }
end

#publish(*args) ⇒ Object



56
57
58
59
# File 'lib/announcer/instance.rb', line 56

def publish(*args)
  raise Errors::NoPublishersDefinedError unless publishers && !publishers.empty?
  _args_to_event(*args).publish
end

#subscribe_to(event_name, params = {}, &block) ⇒ Object



61
62
63
# File 'lib/announcer/instance.rb', line 61

def subscribe_to(event_name, params={}, &block)
  Subscription.new(event_name, params.merge(instance: self), &block)
end

#subscriptions_to(event_or_name) ⇒ Object



65
66
67
68
# File 'lib/announcer/instance.rb', line 65

def subscriptions_to(event_or_name)
  event_name = event_or_name.is_a?(Event) ? event_or_name.name : event_or_name.to_sym
  _registered_subscriptions_to(event_name).dup
end