mole 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. data/Manifest.txt +92 -0
  2. data/README.txt +10 -7
  3. data/lib/mole.rb +63 -1
  4. data/lib/mole/module.rb +136 -124
  5. data/lib/mole/utils/frameworks.rb +32 -7
  6. data/lib/mole/version.rb +1 -1
  7. data/notes/notes.txt +1 -0
  8. data/samples/merbapp/README +14 -0
  9. data/samples/merbapp/Rakefile +124 -0
  10. data/samples/merbapp/app/controllers/application.rb +3 -0
  11. data/samples/merbapp/app/controllers/exceptions.rb +13 -0
  12. data/samples/merbapp/app/controllers/moled.rb +25 -0
  13. data/samples/merbapp/app/helpers/global_helper.rb +5 -0
  14. data/samples/merbapp/app/mailers/views/layout/application.html.erb +1 -0
  15. data/samples/merbapp/app/mailers/views/layout/application.text.erb +1 -0
  16. data/samples/merbapp/app/parts/views/layout/application.html.erb +1 -0
  17. data/samples/merbapp/app/views/exceptions/internal_server_error.html.erb +216 -0
  18. data/samples/merbapp/app/views/exceptions/not_acceptable.html.erb +38 -0
  19. data/samples/merbapp/app/views/exceptions/not_found.html.erb +40 -0
  20. data/samples/merbapp/app/views/layout/application.html.erb +11 -0
  21. data/samples/merbapp/app/views/moled/index.html.erb +5 -0
  22. data/samples/merbapp/app/views/moled/result.html.erb +5 -0
  23. data/samples/merbapp/config/boot.rb +11 -0
  24. data/samples/merbapp/config/dependencies.rb +41 -0
  25. data/samples/merbapp/config/environments/development.rb +1 -0
  26. data/samples/merbapp/config/environments/production.rb +1 -0
  27. data/samples/merbapp/config/environments/test.rb +1 -0
  28. data/samples/merbapp/config/merb.yml +82 -0
  29. data/samples/merbapp/config/merb_init.rb +26 -0
  30. data/samples/merbapp/config/mole_config.rb +33 -0
  31. data/samples/merbapp/config/router.rb +38 -0
  32. data/samples/merbapp/config/upload.conf +0 -0
  33. data/samples/merbapp/log/merb.4000.pid +1 -0
  34. data/samples/merbapp/public/images/merb.jpg +0 -0
  35. data/samples/merbapp/public/merb.fcgi +6 -0
  36. data/samples/merbapp/public/stylesheets/master.css +119 -0
  37. data/samples/merbapp/script/destroy +32 -0
  38. data/samples/merbapp/script/generate +32 -0
  39. data/samples/merbapp/script/stop_merb +13 -0
  40. data/samples/merbapp/spec/spec_helper.rb +15 -0
  41. data/samples/merbapp/test/test_helper.rb +14 -0
  42. data/samples/railsapp/README +14 -0
  43. data/samples/railsapp/Rakefile +10 -0
  44. data/samples/railsapp/app/controllers/application.rb +13 -0
  45. data/samples/railsapp/app/controllers/moled_controller.rb +23 -0
  46. data/samples/railsapp/app/helpers/application_helper.rb +3 -0
  47. data/samples/railsapp/app/views/moled/index.html.erb +5 -0
  48. data/samples/railsapp/app/views/moled/result.html.erb +5 -0
  49. data/samples/railsapp/config/boot.rb +109 -0
  50. data/samples/railsapp/config/database.yml +13 -0
  51. data/samples/railsapp/config/environment.rb +59 -0
  52. data/samples/railsapp/config/environments/development.rb +18 -0
  53. data/samples/railsapp/config/environments/production.rb +20 -0
  54. data/samples/railsapp/config/environments/test.rb +22 -0
  55. data/samples/railsapp/config/initializers/inflections.rb +10 -0
  56. data/samples/railsapp/config/initializers/mime_types.rb +5 -0
  57. data/samples/railsapp/config/initializers/mole.rb +10 -0
  58. data/samples/railsapp/config/moles/mole_config.rb +44 -0
  59. data/samples/railsapp/config/routes.rb +35 -0
  60. data/samples/railsapp/doc/README_FOR_APP +2 -0
  61. data/samples/railsapp/log/development.log +3554 -0
  62. data/samples/railsapp/log/production.log +643 -0
  63. data/samples/railsapp/log/server.log +0 -0
  64. data/samples/railsapp/log/test.log +0 -0
  65. data/samples/railsapp/public/.htaccess +40 -0
  66. data/samples/railsapp/public/404.html +30 -0
  67. data/samples/railsapp/public/422.html +30 -0
  68. data/samples/railsapp/public/500.html +30 -0
  69. data/samples/railsapp/public/dispatch.cgi +10 -0
  70. data/samples/railsapp/public/dispatch.fcgi +24 -0
  71. data/samples/railsapp/public/dispatch.rb +10 -0
  72. data/samples/railsapp/public/favicon.ico +0 -0
  73. data/samples/railsapp/public/images/rails.png +0 -0
  74. data/samples/railsapp/public/javascripts/application.js +2 -0
  75. data/samples/railsapp/public/javascripts/controls.js +963 -0
  76. data/samples/railsapp/public/javascripts/dragdrop.js +972 -0
  77. data/samples/railsapp/public/javascripts/effects.js +1120 -0
  78. data/samples/railsapp/public/javascripts/prototype.js +4225 -0
  79. data/samples/railsapp/public/robots.txt +5 -0
  80. data/samples/railsapp/script/about +3 -0
  81. data/samples/railsapp/script/console +3 -0
  82. data/samples/railsapp/script/destroy +3 -0
  83. data/samples/railsapp/script/generate +3 -0
  84. data/samples/railsapp/script/performance/benchmarker +3 -0
  85. data/samples/railsapp/script/performance/profiler +3 -0
  86. data/samples/railsapp/script/performance/request +3 -0
  87. data/samples/railsapp/script/plugin +3 -0
  88. data/samples/railsapp/script/process/inspector +3 -0
  89. data/samples/railsapp/script/process/reaper +3 -0
  90. data/samples/railsapp/script/process/spawner +3 -0
  91. data/samples/railsapp/script/runner +3 -0
  92. data/samples/railsapp/script/server +3 -0
  93. data/samples/railsapp/test/test_helper.rb +38 -0
  94. data/samples/rubyapp/README +22 -0
  95. data/samples/rubyapp/bin/ruby_app +35 -0
  96. data/samples/rubyapp/config/mole_conf.rb +31 -0
  97. data/samples/rubyapp/lib/fred.rb +22 -0
  98. data/spec/config/auto_mole_config.rb +26 -0
  99. data/spec/data/blee.rb +1 -1
  100. data/spec/module_spec.rb +8 -8
  101. data/spec/mole_spec.rb +70 -1
  102. data/spec/spec_helper.rb +1 -1
  103. data/spec/utils/framework_spec.rb +52 -12
  104. metadata +154 -53
data/Manifest.txt CHANGED
@@ -15,6 +15,98 @@ lib/mole/module.rb
15
15
  lib/mole/moler.rb
16
16
  lib/mole/utils/frameworks.rb
17
17
  lib/mole/version.rb
18
+ notes/notes.txt
19
+ samples/merbapp/README
20
+ samples/merbapp/Rakefile
21
+ samples/merbapp/app/controllers/application.rb
22
+ samples/merbapp/app/controllers/exceptions.rb
23
+ samples/merbapp/app/controllers/moled.rb
24
+ samples/merbapp/app/helpers/global_helper.rb
25
+ samples/merbapp/app/mailers/views/layout/application.html.erb
26
+ samples/merbapp/app/mailers/views/layout/application.text.erb
27
+ samples/merbapp/app/parts/views/layout/application.html.erb
28
+ samples/merbapp/app/views/exceptions/internal_server_error.html.erb
29
+ samples/merbapp/app/views/exceptions/not_acceptable.html.erb
30
+ samples/merbapp/app/views/exceptions/not_found.html.erb
31
+ samples/merbapp/app/views/layout/application.html.erb
32
+ samples/merbapp/app/views/moled/index.html.erb
33
+ samples/merbapp/app/views/moled/result.html.erb
34
+ samples/merbapp/config/boot.rb
35
+ samples/merbapp/config/dependencies.rb
36
+ samples/merbapp/config/environments/development.rb
37
+ samples/merbapp/config/environments/production.rb
38
+ samples/merbapp/config/environments/test.rb
39
+ samples/merbapp/config/merb.yml
40
+ samples/merbapp/config/merb_init.rb
41
+ samples/merbapp/config/mole_config.rb
42
+ samples/merbapp/config/router.rb
43
+ samples/merbapp/config/upload.conf
44
+ samples/merbapp/log/merb.4000.pid
45
+ samples/merbapp/public/images/merb.jpg
46
+ samples/merbapp/public/merb.fcgi
47
+ samples/merbapp/public/stylesheets/master.css
48
+ samples/merbapp/script/destroy
49
+ samples/merbapp/script/generate
50
+ samples/merbapp/script/stop_merb
51
+ samples/merbapp/spec/spec_helper.rb
52
+ samples/merbapp/test/test_helper.rb
53
+ samples/railsapp/README
54
+ samples/railsapp/Rakefile
55
+ samples/railsapp/app/controllers/application.rb
56
+ samples/railsapp/app/controllers/moled_controller.rb
57
+ samples/railsapp/app/helpers/application_helper.rb
58
+ samples/railsapp/app/views/moled/index.html.erb
59
+ samples/railsapp/app/views/moled/result.html.erb
60
+ samples/railsapp/config/boot.rb
61
+ samples/railsapp/config/database.yml
62
+ samples/railsapp/config/environment.rb
63
+ samples/railsapp/config/environments/development.rb
64
+ samples/railsapp/config/environments/production.rb
65
+ samples/railsapp/config/environments/test.rb
66
+ samples/railsapp/config/initializers/inflections.rb
67
+ samples/railsapp/config/initializers/mime_types.rb
68
+ samples/railsapp/config/initializers/mole.rb
69
+ samples/railsapp/config/moles/mole_config.rb
70
+ samples/railsapp/config/routes.rb
71
+ samples/railsapp/doc/README_FOR_APP
72
+ samples/railsapp/log/development.log
73
+ samples/railsapp/log/production.log
74
+ samples/railsapp/log/server.log
75
+ samples/railsapp/log/test.log
76
+ samples/railsapp/public/.htaccess
77
+ samples/railsapp/public/404.html
78
+ samples/railsapp/public/422.html
79
+ samples/railsapp/public/500.html
80
+ samples/railsapp/public/dispatch.cgi
81
+ samples/railsapp/public/dispatch.fcgi
82
+ samples/railsapp/public/dispatch.rb
83
+ samples/railsapp/public/favicon.ico
84
+ samples/railsapp/public/images/rails.png
85
+ samples/railsapp/public/javascripts/application.js
86
+ samples/railsapp/public/javascripts/controls.js
87
+ samples/railsapp/public/javascripts/dragdrop.js
88
+ samples/railsapp/public/javascripts/effects.js
89
+ samples/railsapp/public/javascripts/prototype.js
90
+ samples/railsapp/public/robots.txt
91
+ samples/railsapp/script/about
92
+ samples/railsapp/script/console
93
+ samples/railsapp/script/destroy
94
+ samples/railsapp/script/generate
95
+ samples/railsapp/script/performance/benchmarker
96
+ samples/railsapp/script/performance/profiler
97
+ samples/railsapp/script/performance/request
98
+ samples/railsapp/script/plugin
99
+ samples/railsapp/script/process/inspector
100
+ samples/railsapp/script/process/reaper
101
+ samples/railsapp/script/process/spawner
102
+ samples/railsapp/script/runner
103
+ samples/railsapp/script/server
104
+ samples/railsapp/test/test_helper.rb
105
+ samples/rubyapp/README
106
+ samples/rubyapp/bin/ruby_app
107
+ samples/rubyapp/config/mole_conf.rb
108
+ samples/rubyapp/lib/fred.rb
109
+ spec/config/auto_mole_config.rb
18
110
  spec/config/mole_config.rb
19
111
  spec/config/moles/fred_config.rb
20
112
  spec/data/blee.rb
data/README.txt CHANGED
@@ -26,6 +26,7 @@ instead.
26
26
  * Forum: http://groups.google.com/group/mole-plugin
27
27
  * Home: mole.rubyforge.org
28
28
  * Svn: svn://rubyforge.org/var/svn/mole/mole/trunk
29
+ * Git: git://github.com/derailed/mole.git
29
30
  * Snitch Svn: svn://rubyforge.org/var/svn/mole/snitch/trunk
30
31
  * Examples: svn://rubyforge.org/var/svn/mole/samples
31
32
 
@@ -87,19 +88,21 @@ The MOle allows you to easily
87
88
  :log_level => :debug,
88
89
  :perf_threshold => 2,
89
90
  :mole_config => File.join( File.dirname(__FILE__), %w[mole.rb] ) )
90
- # Load the MOle configuration file(s)
91
- ::Mole.load_configuration
91
+ # Load the MOle configuration file(s)
92
+ ::Mole.load_configuration
92
93
 
93
94
  NOTE: The mole_config can either be a single ruby file or a directory containing multiple MOle
94
95
  configuration files. Thanks to Ian Schreuder for the suggestion !
95
96
 
96
- NOTE: For rails application you can either put the MOle initialization code in a custom initializer
97
- or in your environment file ie config/environments/production.rb. You will need to make the
98
- load_configuration call in your application controller as follows:
97
+ NOTE: For rails applications you can either put the MOle initialization code in a custom initializer
98
+ ie config/initializers/mole.rb or in your environment file (config/environments/production.rb).
99
+ You will need to make the load_configuration call in your application controller(application.rb) as follows:
99
100
 
100
101
  ::Mole.load_mole_configuration rescue nil
101
-
102
-
102
+
103
+ In dev env, the MOle will reload the configuration so you can tweak your app on the fly. In production
104
+ env the MOle configuration will be loaded once.
105
+
103
106
  * Now you'll need to create a mole.rb specification file to specify the various aspects you'll want
104
107
  to inject. This file is specified in the initialize call via the :mole_config tag.
105
108
 
data/lib/mole.rb CHANGED
@@ -191,7 +191,69 @@ unless defined? Mole
191
191
  #
192
192
  def self.load_all_moles_relative_to( mole_dir ) #:nodoc:
193
193
  search_me = ::File.join( mole_dir, '**', '*.rb')
194
- Dir.glob(search_me).sort.each {|rb| logger.debug "---- Loading MOle config '#{rb}'";load rb}
194
+ Dir.glob(search_me).sort.each {|rb| load rb}
195
195
  end
196
+
197
+ # Stolen from inflector
198
+ def self.camelize(lower_case_and_underscored_word)
199
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
200
+ end
201
+
202
+ # Fetch all ruby files in the given directory and return a cltn of class names
203
+ def self.find_controller_classes( dir )
204
+ classes = []
205
+ search_me = ::File.expand_path( ::File.join(dir, '*.rb'))
206
+ Dir.glob(search_me).sort.each {|rb| classes << camelize( File.basename( rb, ".rb") ) }
207
+ classes
208
+ end
209
+
210
+ # Automatically setup on perf MOle on any classes within a given directory
211
+ # NOTE: this call assumes the controller classes are in all in the path
212
+ def self.auto_perf( dir, &block )
213
+ controller_classes = find_controller_classes( dir )
214
+ controller_classes.each do |class_name|
215
+ clazz = Kernel.const_get( class_name )
216
+ features = ::Mole::Utils::Frameworks.features_for( clazz )
217
+ clazz.mole_perf( :features => features, &block )
218
+ end
219
+ end
220
+
221
+ # Automatically setup MOle untrapped exception on any classes within a given directory
222
+ # NOTE: this call assumes the controller classes are in all in the path
223
+ def self.auto_unchecked( dir, &block )
224
+ controller_classes = find_controller_classes( dir )
225
+ controller_classes.each do |class_name|
226
+ clazz = Kernel.const_get( class_name )
227
+ features = ::Mole::Utils::Frameworks.features_for( clazz )
228
+ clazz.mole_unchecked( :features => features, &block )
229
+ end
230
+ end
231
+
232
+ # Automatically setup MOle after filter on any classes within a given directory
233
+ # NOTE: this call assumes the controller classes are in all in the path
234
+ def self.auto_after( dir, &block )
235
+ controller_classes = find_controller_classes( dir )
236
+ controller_classes.each do |class_name|
237
+ clazz = Kernel.const_get( class_name )
238
+ features = ::Mole::Utils::Frameworks.features_for( clazz )
239
+ features.each do |feature|
240
+ clazz.mole_after( :feature => feature, &block )
241
+ end
242
+ end
243
+ end
244
+
245
+ # Automatically setup MOle after filter on any classes within a given directory
246
+ # NOTE: this call assumes the controller classes are in all in the path
247
+ def self.auto_before( dir, &block )
248
+ controller_classes = find_controller_classes( dir )
249
+ controller_classes.each do |class_name|
250
+ clazz = Kernel.const_get( class_name )
251
+ features = ::Mole::Utils::Frameworks.features_for( clazz )
252
+ features.each do |feature|
253
+ clazz.mole_before( :feature => feature, &block )
254
+ end
255
+ end
256
+ end
257
+
196
258
  end
197
259
  end
data/lib/mole/module.rb CHANGED
@@ -93,7 +93,7 @@ class Module
93
93
  # <tt>:interceptor</tt>:: The class name of your interceptor class. If no interceptor block is specified
94
94
  # <tt>:method</tt>:: The name of the method to callback the interceptor on
95
95
  # once an exception condition has been trapped.
96
- def mole_before(opts={}, &interceptor)
96
+ def mole_before(opts={}, &interceptor)
97
97
  raise "Missing :feature option" if opts[:feature].nil? or opts[:feature].to_s.empty?
98
98
  opts[:interceptor] ||= interceptor
99
99
  opts[:method] ||= :call
@@ -133,142 +133,154 @@ class Module
133
133
  after_mole_filters[feature] << [opts[:interceptor], opts[:method]]
134
134
  end
135
135
  end
136
-
137
- # def dump
138
- # puts "Filters for class <- #{self} ->"
139
- # puts "Before filters"
140
- # before_mole_filters.each_pair do |k,v|
141
- # puts "#{k} --> #{v}"
142
- # end
143
- # puts "After filters"
144
- # after_mole_filters.each_pair do |k,v|
145
- # puts "#{k} --> #{v}"
146
- # end
147
- # puts "Unchecked filters"
148
- # unchecked_mole_filters.each_pair do |k,v|
149
- # puts "#{k} --> #{v}"
150
- # end
151
- # puts "Perf filters"
152
- # perf_mole_filters.each_pair do |k,v|
153
- # puts "#{k} --> #{v}"
154
- # end
155
- # end
136
+
137
+ # ---------------------------------------------------------------------------
138
+ # Dumps moled feature info
139
+ def mole_dump( msg=nil )
140
+ puts "\n------------------------------------------------------------------"
141
+ puts "From #{msg}" if msg
142
+ puts "MOle Info for class <- #{self} ->"
143
+ puts "\nBefore filters"
144
+ before_mole_filters.keys.sort.each { |k| puts "\t#{k} --> #{before_mole_filters[k]}" }
145
+ puts "\nAfter filters"
146
+ after_mole_filters.keys.sort.each { |k| puts "\t#{k} --> #{after_mole_filters[k]}" }
147
+ puts "\nUnchecked filters"
148
+ unchecked_mole_filters.keys.sort.each { |k| puts "\t#{k} --> #{unchecked_mole_filters[k]}" }
149
+ puts "\nPerf filters"
150
+ perf_mole_filters.keys.sort.each { |k| puts "\t#{k} --> #{perf_mole_filters[k]}" }
151
+ puts "---------------------------------------------------------------------\n"
152
+ end
156
153
 
157
154
  # ===========================================================================
158
- # protected
155
+ private
156
+
157
+ # Clear MOle state for this class # Used for testing only
158
+ def mole_clear!
159
+ @before_mole_filters = nil
160
+ @after_mole_filters = nil
161
+ @perf_mole_filters = nil
162
+ @unchecked_mole_filters = nil
163
+ end
159
164
 
160
- # ---------------------------------------------------------------------------
161
- # Holds before filters
162
- def before_mole_filters #:nodoc:
163
- @before_mole_filters ||= Hash.new{ |h,k| h[k] = [] }
164
- end
165
+ # ===========================================================================
166
+ public
167
+
168
+ # -------------------------------------------------------------------------
169
+ # Holds before filters
170
+ def before_mole_filters #:nodoc:
171
+ @before_mole_filters ||= Hash.new{ |h,k| h[k] = [] }
172
+ end
165
173
 
166
- # ---------------------------------------------------------------------------
167
- # Holds after filters
168
- def after_mole_filters #:nodoc:
169
- @after_mole_filters ||= Hash.new{ |h,k| h[k] = [] }
170
- end
174
+ # -------------------------------------------------------------------------
175
+ # Holds after filters
176
+ def after_mole_filters #:nodoc:
177
+ @after_mole_filters ||= Hash.new{ |h,k| h[k] = [] }
178
+ end
171
179
 
172
- # Holds perf around filters
173
- def perf_mole_filters #:nodoc:
174
- @perf_mole_filters ||= Hash.new{ |h,k| h[k] = []}
175
- end
176
-
177
- # Holds unchecked exception filters
178
- def unchecked_mole_filters #:nodoc:
179
- @unchecked_mole_filters ||= Hash.new{ |h,k| h[k] = []}
180
- end
181
-
182
- # Attempt to find singleton class method with given name
183
- # TODO Figure out how to get method for static signature...
184
- # def find_public_class_method(method)
185
- # singleton_methods.each { |name| puts "Looking for #{method}--#{method.class} -- #{name}#{name.class}";return name if name == method }
186
- # nil
187
- # end
180
+ # -------------------------------------------------------------------------
181
+ # Holds perf around filters
182
+ def perf_mole_filters #:nodoc:
183
+ @perf_mole_filters ||= Hash.new{ |h,k| h[k] = []}
184
+ end
188
185
 
189
- # Wrap method call
190
- # TODO Add support for wrapping class methods ??
191
- def wrap( method ) #:nodoc:
192
- return if wrapped?( method )
193
- begin
194
- between = instance_method( method )
195
- rescue
196
- # between = find_public_class_method( method )
197
- raise "Unable to find moled feature `#{method}" unless(between)
186
+ # -------------------------------------------------------------------------
187
+ # Holds unchecked exception filters
188
+ def unchecked_mole_filters #:nodoc:
189
+ @unchecked_mole_filters ||= Hash.new{ |h,k| h[k] = []}
198
190
  end
199
- code = <<-code
200
- def #{method}_with_mole (*a, &b)
201
- key = '#{method}'
202
- klass = self.class
203
- between = klass.wrapped[key]
204
- ret_val = nil
205
- klass.apply_before_filters( klass.before_mole_filters[key], self, key, *a, &b )
206
- begin
207
- elapsed = Benchmark::realtime do
208
- ret_val = between.bind(self).call( *a, &b )
209
- end
210
- klass.apply_perf_filters( elapsed, klass.perf_mole_filters[key], self, key, ret_val, *a, &b )
211
- rescue => boom
212
- klass.apply_unchecked_filters( boom, klass.unchecked_mole_filters[key], self, key, *a, &b )
213
- raise boom
214
- end
215
- klass.apply_after_filters( klass.after_mole_filters[key], self, key, ret_val, *a, &b )
216
- ret_val
191
+
192
+ # -------------------------------------------------------------------------
193
+ # Attempt to find singleton class method with given name
194
+ # TODO Figure out how to get method for static signature...
195
+ # def find_public_class_method(method)
196
+ # singleton_methods.each { |name| puts "Looking for #{method}--#{method.class} -- #{name}#{name.class}";return name if name == method }
197
+ # nil
198
+ # end
199
+
200
+ # -------------------------------------------------------------------------
201
+ # Wrap method call
202
+ # TODO Add support for wrapping class methods ??
203
+ def wrap( method ) #:nodoc:
204
+ return if wrapped?( method )
205
+ begin
206
+ between = instance_method( method )
207
+ rescue
208
+ # between = find_public_class_method( method )
209
+ raise "Unable to find moled feature `#{method}" unless(between)
217
210
  end
218
- code
219
-
220
- module_eval code
221
- alias_method_chain method, "mole"
222
- wrapped[method.to_s] = between
223
- end
211
+ code = <<-code
212
+ def #{method}_with_mole (*a, &b)
213
+ key = '#{method}'
214
+ klass = self.class
215
+ between = klass.wrapped[key]
216
+ ret_val = nil
217
+ klass.apply_before_filters( klass.before_mole_filters[key], self, key, *a, &b ) if klass.before_mole_filters[key]
218
+ begin
219
+ elapsed = Benchmark::realtime do
220
+ ret_val = between.bind(self).call( *a, &b )
221
+ end
222
+ klass.apply_perf_filters( elapsed, klass.perf_mole_filters[key], self, key, ret_val, *a, &b ) if klass.perf_mole_filters[key]
223
+ rescue => boom
224
+ klass.apply_unchecked_filters( boom, klass.unchecked_mole_filters[key], self, key, *a, &b ) if klass.unchecked_mole_filters[key]
225
+ raise boom
226
+ end
227
+ klass.apply_after_filters( klass.after_mole_filters[key], self, key, ret_val, *a, &b ) if klass.after_mole_filters[key]
228
+ ret_val
229
+ end
230
+ code
224
231
 
225
- def apply_before_filters( filters, clazz, key, *a, &b ) #:nodoc:
226
- begin
227
- filters.each { |r,m| r.send( m, clazz, key, b, *a ) }
228
- rescue => ca_boom
229
- ::Mole.logger.error ">>> Mole Error: Before-Filter -- " + ca_boom
230
- # ca_boom.backtrace.each { |l| ::Mole.logger.error l }
232
+ module_eval code
233
+ alias_method_chain method, "mole"
234
+ wrapped[method.to_s] = between
231
235
  end
232
- end
236
+
237
+ def apply_before_filters( filters, clazz, key, *a, &b ) #:nodoc:
238
+ begin
239
+ filters.each { |r,m| r.send( m, clazz, key, b, *a ) }
240
+ rescue => ca_boom
241
+ ::Mole.logger.error ">>> MOle Failure: Before-Filter -- " + ca_boom
242
+ ca_boom.backtrace.each { |l| ::Mole.logger.error l }
243
+ end
244
+ end
233
245
 
234
- def apply_after_filters( filters, clazz, key, ret_val, *a, &b ) #:nodoc:
235
- begin
236
- filters.each { |r,m| r.send( m, clazz, key, ret_val, b, *a ) }
237
- rescue => ca_boom
238
- ::Mole.logger.error ">>> Mole Error: After-Filter -- " + ca_boom
239
- # ca_boom.backtrace.each { |l| ::Mole.logger.error l }
240
- end
241
- end
246
+ def apply_after_filters( filters, clazz, key, ret_val, *a, &b ) #:nodoc:
247
+ begin
248
+ filters.each { |r,m| r.send( m, clazz, key, ret_val, b, *a ) }
249
+ rescue => ca_boom
250
+ ::Mole.logger.error ">>> MOle Failure: After-Filter -- " + ca_boom
251
+ ca_boom.backtrace.each { |l| ::Mole.logger.error l }
252
+ end
253
+ end
242
254
 
243
- def apply_perf_filters( elapsed, filters, clazz, key, ret_val, *a, &b ) #:nodoc:
244
- begin
245
- if ( elapsed >= Mole.perf_threshold )
246
- filters.each { |r,m| r.send( m, clazz, key, elapsed, ret_val, b, *a ) }
247
- end
248
- rescue => ca_boom
249
- ::Mole.logger.error ">>> Mole Error: Perf-Filter -- " + ca_boom
250
- # ca_boom.backtrace.each { |l| ::Mole.logger.error l }
251
- end
252
- end
255
+ def apply_perf_filters( elapsed, filters, clazz, key, ret_val, *a, &b ) #:nodoc:
256
+ begin
257
+ if ( elapsed >= Mole.perf_threshold )
258
+ filters.each { |r,m| r.send( m, clazz, key, elapsed, ret_val, b, *a ) }
259
+ end
260
+ rescue => ca_boom
261
+ ::Mole.logger.error ">>> MOle Failure: Perf-Filter -- " + ca_boom
262
+ ca_boom.backtrace.each { |l| ::Mole.logger.error l }
263
+ end
264
+ end
253
265
 
254
- def apply_unchecked_filters( boom, filters, clazz, key, *a, &b ) #:nodoc:
255
- begin
256
- filters.each { |r,m| r.send( m, clazz, key, boom, b, *a ) }
257
- rescue => ca_boom
258
- ::Mole.logger.error ">>> Mole Error: Unchecked-Filter -- " + ca_boom
259
- # ca_boom.backtrace.each { |l| ::Mole.logger.error l }
260
- end
261
- end
266
+ def apply_unchecked_filters( boom, filters, clazz, key, *a, &b ) #:nodoc:
267
+ begin
268
+ filters.each { |r,m| r.send( m, clazz, key, boom, b, *a ) }
269
+ rescue => ca_boom
270
+ ::Mole.logger.error ">>> MOle Failure: Unchecked-Filter -- " + ca_boom
271
+ ca_boom.backtrace.each { |l| ::Mole.logger.error l }
272
+ end
273
+ end
262
274
 
263
- # ---------------------------------------------------------------------------
264
- # Log wrapped class
265
- def wrapped #:nodoc:
266
- @wrapped ||= {}
267
- end
275
+ # ---------------------------------------------------------------------------
276
+ # Log wrapped class
277
+ def wrapped #:nodoc:
278
+ @wrapped ||= {}
279
+ end
268
280
 
269
- # ---------------------------------------------------------------------------
270
- # Check if method has been wrapped
271
- def wrapped?(which) #:nodoc:
272
- wrapped.has_key?(which.to_s)
273
- end
281
+ # ---------------------------------------------------------------------------
282
+ # Check if method has been wrapped
283
+ def wrapped?(which) #:nodoc:
284
+ wrapped.has_key?(which.to_s)
285
+ end
274
286
  end