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 property.



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

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"


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

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


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

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.



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

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.



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

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


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

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