sparksofl
1/30/2017 - 5:05 PM

lifetime hooks

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