Module: ObjectTracker
- Defined in:
- lib/object_tracker.rb,
lib/object_tracker/version.rb
Defined Under Namespace
Classes: UntrackableMethod
Constant Summary collapse
- VERSION =
'1.0.2'.freeze
Instance Method Summary collapse
-
#cleanse(str) ⇒ Object
PRIVATE.
- #track(*args) ⇒ Object
- #track!(method_names = nil) ⇒ Object
- #track_all! ⇒ Object
- #track_methods_for(obj) ⇒ Object
- #track_not(*args) ⇒ Object
- #track_reserved_methods ⇒ Object
- #track_with_source(obj, method_name) ⇒ Object
- #tracking ⇒ Object
- #tracking?(method_name) ⇒ Boolean
Instance Method Details
#cleanse(str) ⇒ Object
PRIVATE
46 47 48 |
# File 'lib/object_tracker.rb', line 46 def cleanse(str) str.to_s.sub(/^[#.]/, '') end |
#track(*args) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/object_tracker.rb', line 6 def track(*args) args.each do |method_name| next if tracking?(method_name) || track_reserved_methods.include?(method_name) if respond_to?(method_name) track!(method_name => track_with_source(self, method_name)) elsif respond_to?(:allocate) inst = allocate if inst.respond_to?(method_name) track!(method_name => track_with_source(inst, method_name)) else fail UntrackableMethod, method_name end else fail UntrackableMethod, method_name end end nil end |
#track!(method_names = nil) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/object_tracker.rb', line 50 def track!(method_names = nil) mod = Module.new Array(method_names || tracking).each do |method_name, source_def| mod.module_eval <<-RUBY, __FILE__, __LINE__ def #{cleanse(method_name)}(*args, &block) msg = %Q( * called "#{method_name}" ) msg << "with " << args.join(', ') << " " if args.any? msg << "[#{source_def}]" puts msg super rescue NoMethodError => e raise e if e.message !~ /no superclass/ end RUBY end mod.module_eval <<-RUBY, __FILE__, __LINE__ def self.prepended(base) base.extend(self) end RUBY # Handle both instance and class level extension if respond_to?(:prepend) prepend(mod) else extend(mod) end end |
#track_all! ⇒ Object
36 37 38 39 40 |
# File 'lib/object_tracker.rb', line 36 def track_all! track_methods_for(self) track_methods_for(allocate) if respond_to?(:allocate) track! end |
#track_methods_for(obj) ⇒ Object
80 81 82 83 84 |
# File 'lib/object_tracker.rb', line 80 def track_methods_for(obj) (obj.methods - track_reserved_methods).each do |method_name| track_with_source(obj, method_name) end end |
#track_not(*args) ⇒ Object
29 30 31 32 33 34 |
# File 'lib/object_tracker.rb', line 29 def track_not(*args) args.each do |method_name| track_reserved_methods << method_name unless track_reserved_methods.include?(method_name) end nil end |
#track_reserved_methods ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/object_tracker.rb', line 96 def track_reserved_methods @__reserved_methods ||= [ :!, :!=, :!~, :<, :<=, :<=>, :==, :===, :=~, :>, :>=, :[], :[]=, :__id__, :__send__, :`, :public_send, :send, :class, :object_id, :track, :tracking?, :track_not, :track_all!, :track!, :track_methods_for, :track_with_source, :tracking, :track_reserved_methods ] end |
#track_with_source(obj, method_name) ⇒ Object
86 87 88 89 90 |
# File 'lib/object_tracker.rb', line 86 def track_with_source(obj, method_name) source = obj.method(method_name).source_location || ['RUBY CORE'] prefix = obj.class == Class ? '.' : '#' tracking["#{prefix}#{method_name}".to_sym] = source.join(':').split('/').last(5).join('/') end |
#tracking ⇒ Object
92 93 94 |
# File 'lib/object_tracker.rb', line 92 def tracking @__tracking ||= {} end |
#tracking?(method_name) ⇒ Boolean
25 26 27 |
# File 'lib/object_tracker.rb', line 25 def tracking?(method_name) tracking.keys.include?(cleanse(method_name).to_sym) end |