File: tracing.rb

package info (click to toggle)
ruby-guard 2.18.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,344 kB
  • sloc: ruby: 9,256; makefile: 6
file content (33 lines) | stat: -rw-r--r-- 930 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module Guard
  module Internals
    module Tracing
      def self.trace(mod, meth)
        meta = (class << mod; self; end)
        original_meth = "original_#{meth}".to_sym

        if mod.respond_to?(original_meth)
          fail "ALREADY TRACED: #{mod}.#{meth}"
        end

        meta.send(:alias_method, original_meth, meth)
        meta.send(:define_method, meth) do |*args, &block|
          yield(*args) if block_given?
          mod.send original_meth, *args, &block
        end
      end

      def self.untrace(mod, meth)
        meta = (class << mod; self; end)
        original_meth = "original_#{meth}".to_sym

        unless mod.respond_to?(original_meth)
          fail "NOT TRACED: #{mod}.#{meth} (no method: #{original_meth})"
        end

        meta.send(:remove_method, meth)
        meta.send(:alias_method, meth, original_meth)
        meta.send(:undef_method, original_meth)
      end
    end
  end
end