module ObjectCallbacks

Constants

VERSION

Public Instance Methods

after_call(action_name, options = {}) click to toggle source
# File lib/object_callbacks.rb, line 16
def after_call(action_name, options = {})
  after_calls[action_name] = options
end
before_call(action_name, options = {}) click to toggle source
# File lib/object_callbacks.rb, line 12
def before_call(action_name, options = {})
  before_calls[action_name] = options
end
method_added(action_name) click to toggle source
# File lib/object_callbacks.rb, line 4
def method_added(action_name)
  if actions.include?(action_name) || before_calls.key?(action_name) || after_calls.key?(action_name)
    return
  end

  apply_callback_actions(action_name)
end

Private Instance Methods

actions() click to toggle source
# File lib/object_callbacks.rb, line 30
def actions
  @actions ||= []
end
after_calls() click to toggle source
# File lib/object_callbacks.rb, line 26
def after_calls
  @after_calls ||= {}
end
apply_callback_actions(action_name) click to toggle source
# File lib/object_callbacks.rb, line 34
def apply_callback_actions(action_name)
  actions << action_name

  original_method = instance_method(action_name)

  define_method(action_name) do |*args, &block|
    val = self.class.send(:execute_before_calls, action_name, self)
    return false if val == false
    result = original_method.bind(self).call(*args, &block)
    self.class.send(:execute_after_calls, action_name, self)

    result
  end
end
before_calls() click to toggle source
# File lib/object_callbacks.rb, line 22
def before_calls
  @before_calls ||= {}
end
callbacks_for_all(callbacks) click to toggle source
# File lib/object_callbacks.rb, line 70
def callbacks_for_all(callbacks)
  callbacks.to_a.select{|key, value| value.empty?}.map(&:first)
end
callbacks_for_method(action_name, callback_type) click to toggle source
# File lib/object_callbacks.rb, line 62
def callbacks_for_method(action_name, callback_type)
  callbacks = send("#{callback_type}_calls")

  callbacks_for_all(callbacks) +
    only_callbacks(callbacks, action_name) +
    except_callbacks(callbacks, action_name)
end
except_callbacks(callbacks, action_name) click to toggle source
# File lib/object_callbacks.rb, line 80
def except_callbacks(callbacks, action_name)
  callbacks.to_a.select do |_key, value|
    !value[:except].nil? && !value[:except].include?(action_name)
  end.map(&:first)
end
execute_after_calls(action_name, instance) click to toggle source
# File lib/object_callbacks.rb, line 56
def execute_after_calls(action_name, instance)
  callbacks_for_method(action_name, :after).each do |after_call_method|
    instance.send(after_call_method)
  end
end
execute_before_calls(action_name, instance) click to toggle source
# File lib/object_callbacks.rb, line 49
def execute_before_calls(action_name, instance)
  callbacks_for_method(action_name, :before).each do |before_call_method|
    val = instance.send(before_call_method)
    return false if val == false
  end
end
only_callbacks(callbacks, action_name) click to toggle source
# File lib/object_callbacks.rb, line 74
def only_callbacks(callbacks, action_name)
  callbacks.to_a.select do |_key, value|
    !value[:only].nil? && value[:only].include?(action_name)
  end.map(&:first)
end