lib/asset_cloud/callbacks.rb in asset_cloud-2.2.4 vs lib/asset_cloud/callbacks.rb in asset_cloud-2.2.5

- old
+ new

@@ -1,36 +1,46 @@ -require 'class_inheritable_attributes' - module AssetCloud module Callbacks extend ActiveSupport::Concern module ClassMethods def callback_methods(*symbols) symbols.each do |method| - code = <<-"end_eval" - def self.before_#{method}(*callbacks, &block) - callbacks << block if block_given? - write_inheritable_array(:before_#{method}, callbacks) - end + define_callbacks(method) + end + end - def self.after_#{method}(*callbacks, &block) - callbacks << block if block_given? - write_inheritable_array(:after_#{method}, callbacks) - end + def define_callbacks(method) + before = :"before_#{method}" + after = :"after_#{method}" + extension_module.send(:define_method, method) do |*args, &block| + result = nil + if execute_callbacks(before, args) + result = super(*args, &block) + execute_callbacks(after, args) + end + result + end - def #{method}_with_callbacks(*args) - if execute_callbacks(:before_#{method}, args) - result = #{method}_without_callbacks(*args) - execute_callbacks(:after_#{method}, args) - end - result - end + define_singleton_method(before) do |*callbacks, &block| + callbacks << block if block_given? + write_inheritable_array(before, callbacks) + end - alias_method_chain :#{method}, 'callbacks' - end_eval + define_singleton_method(after) do |*callbacks, &block| + callbacks << block if block_given? + write_inheritable_array(after, callbacks) + end + end - self.class_eval code, __FILE__, __LINE__ + private + + def extension_module + @extension_module ||= begin + mod = Module.new + self.const_set(:AssetCloudCallbacks, mod) + prepend(mod) + mod end end end def execute_callbacks(symbol, args)