mole 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
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