Method: DataMapper::Hook::ClassMethods#define_advised_method

Defined in:
lib/dm-core/support/hook.rb

#define_advised_method(target_method, scope) ⇒ Object



275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
# File 'lib/dm-core/support/hook.rb', line 275

def define_advised_method(target_method, scope)
  args = args_for(method_with_scope(target_method, scope))

  renamed_target = hook_method_name(target_method, 'hookable_', 'before_advised')

  source = "    def \#{target_method}(\#{args})\n      retval = nil\n      catch(:halt) do\n        \#{hook_method_name(target_method, 'execute_before', 'hook_stack')}(\#{args})\n        retval = \#{renamed_target}(\#{args})\n        \#{hook_method_name(target_method, 'execute_after', 'hook_stack')}(retval, \#{args})\n        retval\n      end\n    end\n  EOD\n\n  if scope == :instance && !instance_methods(false).any? { |m| m.to_sym == target_method }\n    send(:alias_method, renamed_target, target_method)\n\n    proxy_module = Module.new\n    proxy_module.class_eval(source, __FILE__, __LINE__)\n    self.send(:include, proxy_module)\n  else\n    source = %{alias_method :\#{renamed_target}, :\#{target_method}\\n\#{source}}\n    source = %{class << self\\n\#{source}\\nend} if scope == :class\n    class_eval(source, __FILE__, __LINE__)\n  end\nend\n"