Class: Hometown::DisposalTracer
- Inherits:
-
Object
- Object
- Hometown::DisposalTracer
- Defined in:
- lib/hometown/disposal_tracer.rb
Instance Attribute Summary collapse
-
#undisposed ⇒ Object
readonly
Returns the value of attribute undisposed.
Instance Method Summary collapse
-
#initialize ⇒ DisposalTracer
constructor
A new instance of DisposalTracer.
- #mark_for_disposal(instance) ⇒ Object
- #notice_disposed(instance) ⇒ Object
- #patch(clazz, disposal_method) ⇒ Object
- #patch_disposal_method(clazz, disposal_method) ⇒ Object
- #trace_creation(clazz) ⇒ Object
Constructor Details
#initialize ⇒ DisposalTracer
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
#undisposed ⇒ Object (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 |