lifetime hooks
class User
attr_reader :id, :name
def initialize(id = 1, name = 'John')
@id = id
@name = name
end
def greet
p 'hi!'
end
def bye
p 'bye!'
end
end
register User do
before(:greet) { puts 'before greet' }
after :bye do
puts 'after bye'
end
end
require 'active_support/callbacks'
class ActivityLogger
def initialize(klass)
@klass = klass
@klass.class_eval do
include ActiveSupport::Callbacks
end
end
%i(before after).each do |method_name|
define_method(method_name) do |trigger_action, &block|
@klass.class_eval do
kallback = "#{method_name}_#{trigger_action}_log".to_sym
define_callbacks kallback
set_callback kallback, method_name, block
old_trigger_action = instance_method(trigger_action)
define_method(trigger_action) do
run_callbacks kallback do
old_trigger_action.bind(self).call
end
end
end
end
end
end
def register(klass, &block)
activity_logger = ActivityLogger.new(klass)
activity_logger.instance_eval(&block)
end