Class: Nanoc2::NotificationCenter

Inherits:
Object
  • Object
show all
Defined in:
lib/nanoc2/base/notification_center.rb

Overview

Nanoc2::NotificationCenter provides a way to send notifications between objects. It allows blocks associated with a certain notification name to be registered; these blocks will be called when the notification with the given name is posted.

It is a slightly different implementation of the Observer pattern; the table of subscribers is not stored in the observable object itself, but in the notification center.

Class Method Summary collapse

Class Method Details

.on(name, id = nil, &block) ⇒ Object

Adds the given block to the list of blocks that should be called when the notification with the given name is received.

name

The name of the notification that will be posted.

id

An identifier for the block. This is only used to be able to remove the block (using the remove method) later. Defaults to nil.



23
24
25
26
27
28
# File 'lib/nanoc2/base/notification_center.rb', line 23

def on(name, id=nil, &block)
  initialize_if_necessary(name)

  # Add observer
  @notifications[name] << { :id => id, :block => block }
end

.post(name, *args) ⇒ Object

Posts a notification with the given name. All arguments wil be passed to the blocks handling the notification.



32
33
34
35
36
37
38
39
# File 'lib/nanoc2/base/notification_center.rb', line 32

def post(name, *args)
  initialize_if_necessary(name)

  # Notify all observers
  @notifications[name].each do |observer|
    observer[:block].call(*args)
  end
end

.remove(name, id) ⇒ Object

Removes the block with the given identifier from the list of blocks that should be called when the notification with the given name is posted.

name

The name of the notification that will be posted.

id

The identifier of the block that should be removed.



48
49
50
51
52
53
# File 'lib/nanoc2/base/notification_center.rb', line 48

def remove(name, id)
  initialize_if_necessary(name)

  # Remove relevant observers
  @notifications[name].reject! { |i| i[:id] == id }
end