Module: Entraceable

Defined in:
lib/entraceable.rb,
lib/entraceable/version.rb,
lib/entraceable_preference.rb

Defined Under Namespace

Classes: Preference

Constant Summary collapse

VERSION =
"0.1.6"

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.preferenceObject

Returns the value of attribute preference.



8
9
10
# File 'lib/entraceable.rb', line 8

def preference
  @preference
end

Class Method Details

.loggerObject



10
11
12
# File 'lib/entraceable.rb', line 10

def logger
  @logger ||= Rails.logger
end

.logger=(arg) ⇒ Object



14
15
16
# File 'lib/entraceable.rb', line 14

def logger=(arg)
  @logger = arg
end

.method_missing(method, *args, &block) ⇒ Object



18
19
20
21
# File 'lib/entraceable.rb', line 18

def method_missing(method, *args, &block)
  raise NoMethodError.new %q(undefined method `#{method}' for #{preference}:#{preference.class}) unless accept? method
  preference.__send__ method, *args, &block
end

Instance Method Details

#distraceable(method) ⇒ Object



48
49
50
51
52
53
# File 'lib/entraceable.rb', line 48

def distraceable(method)
  alias_name = alias_name_for method
  __send__ :remove_method, method
  __send__ :alias_method, method, alias_name
  __send__ :remove_method, alias_name
end

#entraceable(method, tag: nil, level: nil) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/entraceable.rb', line 29

def entraceable(method, tag: nil, level: nil)
  alias_name = alias_name_for method
  __send__ :alias_method, alias_name, method
  class_eval <<-EOS
    def #{method}(*args, &block)
      indent = " " * ((@indent_level ||= 0) * 2)
      level = (#{level.inspect} || Entraceable.default_level).intern
      puts = ->c{Entraceable.logger.tagged(%Q(#{tag})) {Entraceable.logger.__send__ level, indent + c} if Entraceable.enabled?}
      puts.call %Q(#{method} is called with arguments, \#\{args.map(&:inspect).join(", ")\})
      @indent_level += 1
      begin
        __send__(:#{alias_name}, *args, &block).tap{|result|puts.call %Q(#{method} returns \#\{result\})}
      ensure
        @indent_level -= 1
      end
    end
  EOS
end