Module: PlainRecord::Callbacks

Included in:
Model
Defined in:
lib/plain_record/callbacks.rb

Overview

Callbacks are hooks that allow you to define methods to run before and after some method, to change it logic.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#callbacksObject

Hash of class callbacks with field.



26
27
28
# File 'lib/plain_record/callbacks.rb', line 26

def callbacks
  @callbacks
end

Instance Method Details

#after(events, priority = 1, &block) ⇒ Object

Set block as callback after events. Callback with less priority will start earlier.

After callbacks may change method return, which will be pass as first argument for first callback. It return will be pass for next callback and so on.

class Person
include PlainRecord::Callbacks

def name
  use_callbacks(:name) do
    'John'
  end
end
end

class GreatPerson < Person
after :name, 2 do |name|
  'Great ' + name
end

after :name do |name|
  'The ' + name
end
end

GreatPerson.new.name #=> "The Great John"


89
90
91
92
93
# File 'lib/plain_record/callbacks.rb', line 89

def after(events, priority = 1, &block)
  Array(events).each do |event|
    add_callback(:after, event, priority, block)
  end
end

#before(events, priority = 1, &block) ⇒ Object

Set block as callback before events. Callback with less priority will start earlier.

class File
include PlainRecord::Callbacks

attr_accessor :name
attr_accessor :content

def save
  use_callbacks(:save, self) do
    File.open(@name, 'w') { |io| io.puts @content }
  end
end
end

class NewFile < File
before :save do |file|
  while File.exists? file.name
    file.name = 'another ' + file.name
  end
end

before, :save do
  raise ArgumentError if 255 < @name.length
end
end


55
56
57
58
59
# File 'lib/plain_record/callbacks.rb', line 55

def before(events, priority = 1, &block)
  Array(events).each do |event|
    add_callback(:before, event, priority, block)
  end
end

#call_after_callbacks(event, result, params) ⇒ Object

Call before callbacks for event with params. Callbacks can change result. In your code use more pretty use_callbacks method.



106
107
108
109
110
111
112
# File 'lib/plain_record/callbacks.rb', line 106

def call_after_callbacks(event, result, params)
  init_callbacks(event)
  @callbacks[:after][event].each do |after, priority|
    result = after.call(result, *params)
  end
  result
end

#call_before_callbacks(event, params) ⇒ Object

Call before callbacks for event with params. In your code use more pretty use_callbacks method.



97
98
99
100
101
102
# File 'lib/plain_record/callbacks.rb', line 97

def call_before_callbacks(event, params)
  init_callbacks(event)
  @callbacks[:before][event].each do |before, priority|
    before.call(*params)
  end
end

#use_callbacks(event, *params, &block) ⇒ Object

Call before callback for event, run block and give it result to after callbacks.

def my_save_method(entry)
use_callbacks(:save, enrty) do
  entry.file.write
end
end


122
123
124
125
126
# File 'lib/plain_record/callbacks.rb', line 122

def use_callbacks(event, *params, &block)
  call_before_callbacks(event, params)
  result = yield
  call_after_callbacks(event, result, params)
end