Class: Object

Inherits:
BasicObject
Defined in:
lib/rshade/core_extensions/object/reveal.rb

Instance Method Summary collapse

Instance Method Details

#reveal(method_name = nil, **opts, &block) ⇒ Object

rubocop:disable Metrics/MethodLength



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
34
35
36
37
38
# File 'lib/rshade/core_extensions/object/reveal.rb', line 5

def reveal(method_name = nil, **opts, &block)
  if method_name
    @__cache_rshade_reveal ||= {}
    config = opts.fetch(:config, ::RShade::Config::Registry.instance.default_trace_config)
    @__cache_rshade_reveal[method_name] = config
    instance_eval do
      def method_added(name)
        super
        return unless @__cache_rshade_reveal[name]

        if @__reveal_rewrite
          @__reveal_rewrite = false
          return
        end
        @__reveal_rewrite = true
        config = @__cache_rshade_reveal[name]
        origin_method = instance_method(name)
        define_method(name) do |*args, &fn|
          val = nil
          trace = ::RShade::Trace.reveal(config: config) do
            val = origin_method.bind(self).call(*args, &fn)
          end
          trace.show
          val
        end
      end
    end
  else
    trace = ::RShade::Trace.reveal do
      block.call if block_given?
    end
    trace.show
  end
end