class Jsm::Callbacks::Chain
chain is a repository to store list of callbacks of an event, for example store before and after callback of an event called `run` e.g: before_callback = Jsm::Callbacks::Callback.new
(:before) do |user| log.info('before callback') end before_callback2 = Jsm::Callbacks::Callback.new
(:before) do |user|
user.age = 20
end after_callback = Jsm::Callbacks::Callback.new
(:after) do |result, user|
log.info('after callback')
end chain = Jsm::Callbacks::Chain.new
(:run) chain.insert_callback(before_callback) chain.insert_callback(before_callback2) chain.insert_callback(after_callback) user = User.new result = chain.compile user do |user|
user.address = 'Indonesia'
end result -> true log -> before callback after callback user.address -> 'Indonesia'
Attributes
callbacks[R]
context[R]
Public Class Methods
new(context)
click to toggle source
# File lib/jsm/callbacks/chain.rb, line 27 def initialize(context) @context = context @callbacks = [] end
Public Instance Methods
compile(*args, &block)
click to toggle source
# File lib/jsm/callbacks/chain.rb, line 36 def compile(*args, &block) arrange_callbacks(*args, &block) end
insert_callback(callback)
click to toggle source
# File lib/jsm/callbacks/chain.rb, line 32 def insert_callback(callback) @callbacks.push(callback) end
Private Instance Methods
arrange_callbacks(*args, &block)
click to toggle source
run callbacks from before, given block then after callback
the return value is the original given block result before callback get arguments from *args after callback get result of block execution and *args
# File lib/jsm/callbacks/chain.rb, line 45 def arrange_callbacks(*args, &block) before = @callbacks.select { |callback| callback.filter_type == :before } after = @callbacks.select { |callback| callback.filter_type == :after } before.each {|callback| callback.execute(*args) } return_value = block.call(*args) after.each { |callback| callback.execute(return_value, *args) } return_value end