Sha256: e3ad865830e2e6a79b8f57fd3cc01a10575b5224e6ee95dd5458f86378c9d9d8

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

require 'disallow/exceptions'

module Disallow
  module Callbacks
    #
    # disallow specific callbacks
    # CALLBACKS = [
    #   :after_initialize, :after_find, :after_touch, :before_validation, :after_validation,
    #   :before_save, :around_save, :after_save, :before_create, :around_create,
    #   :after_create, :before_update, :around_update, :after_update,
    #   :before_destroy, :around_destroy, :after_destroy, :after_commit, :after_rollback
    # ]
    #
    ActiveRecord::Callbacks::CALLBACKS.each do |callback|
      kind, name = callback.to_s.split('_').map(&:to_sym)
      method_name = "disallow_#{callback}_callbacks!"
      flag_name = method_name.gsub("!", "")

      define_method(method_name) do |*args|
        if public_send("_#{name}_callbacks").any? { |c| c.kind == kind && c.name == name }
          raise Disallow::CallbackError.new(self.name, callback)
        end

        instance_variable_set("@#{flag_name}", true)
      end

      define_method(callback) do |*args|
        if instance_variable_get("@#{flag_name}")
          raise Disallow::CallbackError.new(self.name, callback)
        else
          super(*args)
        end
      end
    end

    # disallow all callbacks
    def disallow_callbacks!
      raise Disallow::CallbackError.new(self.name, nil)  if __callbacks.any?
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
disallow-0.1.1 lib/disallow/callbacks.rb
disallow-0.1.0 lib/disallow/callbacks.rb