Class: Hometown::DisposalTracer

Inherits:
Object
  • Object
show all
Defined in:
lib/hometown/disposal_tracer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDisposalTracer

Returns a new instance of DisposalTracer.



5
6
7
8
# File 'lib/hometown/disposal_tracer.rb', line 5

def initialize
  @undisposed      = Hash.new(0)
  @tracing_classes = {}
end

Instance Attribute Details

#undisposedObject (readonly)

Returns the value of attribute undisposed.



3
4
5
# File 'lib/hometown/disposal_tracer.rb', line 3

def undisposed
  @undisposed
end

Instance Method Details

#mark_for_disposal(instance) ⇒ Object



37
38
39
40
# File 'lib/hometown/disposal_tracer.rb', line 37

def mark_for_disposal(instance)
  trace = Hometown.for(instance)
  @undisposed[trace] += 1
end

#notice_disposed(instance) ⇒ Object



42
43
44
45
# File 'lib/hometown/disposal_tracer.rb', line 42

def notice_disposed(instance)
  trace = Hometown.for(instance)
  @undisposed[trace] -= 1 if @undisposed[trace]
end

#patch(clazz, disposal_method) ⇒ Object



10
11
12
13
14
15
16
# File 'lib/hometown/disposal_tracer.rb', line 10

def patch(clazz, disposal_method)
  return if @tracing_classes.include?(clazz)
  @tracing_classes[clazz] = true

  trace_creation(clazz)
  patch_disposal_method(clazz, disposal_method)
end

#patch_disposal_method(clazz, disposal_method) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/hometown/disposal_tracer.rb', line 22

def patch_disposal_method(clazz, disposal_method)
  traced   = "#{disposal_method}_traced"
  untraced = "#{disposal_method}_untraced"

  clazz.class_eval do
    define_method(traced) do |*args, &blk|
      Hometown.disposal_tracer.notice_disposed(self)
      self.send(untraced, *args, &blk)
    end

    alias_method untraced, disposal_method
    alias_method disposal_method, traced
  end
end

#trace_creation(clazz) ⇒ Object



18
19
20
# File 'lib/hometown/disposal_tracer.rb', line 18

def trace_creation(clazz)
  Hometown.creation_tracer.patch(clazz, method(:mark_for_disposal))
end