aspector 0.13.1 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rubocop.yml +26 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +8 -11
  7. data/Changelog.md +59 -0
  8. data/Gemfile +9 -14
  9. data/Gemfile.lock +84 -50
  10. data/README.md +118 -0
  11. data/Rakefile +6 -22
  12. data/aspector.gemspec +15 -127
  13. data/benchmarks/after_benchmark.rb +28 -0
  14. data/benchmarks/around_advice_benchmark.rb +35 -0
  15. data/benchmarks/around_benchmark.rb +32 -0
  16. data/benchmarks/before_benchmark.rb +28 -0
  17. data/benchmarks/benchmark_helper.rb +17 -0
  18. data/benchmarks/combined_benchmark.rb +36 -0
  19. data/benchmarks/method_invocation_benchmark.rb +30 -0
  20. data/benchmarks/raw_benchmark.rb +39 -0
  21. data/examples/activerecord_hooks.rb +10 -15
  22. data/examples/around_example.rb +20 -31
  23. data/examples/aspector_apply_example.rb +10 -17
  24. data/examples/aspector_example.rb +7 -16
  25. data/examples/cache_aspect.rb +20 -30
  26. data/examples/design_by_contract.rb +20 -44
  27. data/examples/exception_handler.rb +12 -20
  28. data/examples/exception_handler2.rb +16 -24
  29. data/examples/implicit_method_option_test.rb +8 -16
  30. data/examples/interception_options_example.rb +71 -0
  31. data/examples/logging_aspect.rb +16 -24
  32. data/examples/process_aspector.rb +13 -0
  33. data/examples/retry_aspect.rb +20 -20
  34. data/lib/aspector.rb +17 -15
  35. data/lib/aspector/advice.rb +44 -57
  36. data/lib/aspector/advice_metadata.rb +10 -11
  37. data/lib/aspector/aspect_instances.rb +2 -3
  38. data/lib/aspector/base.rb +6 -368
  39. data/lib/aspector/base_class_methods.rb +24 -55
  40. data/lib/aspector/deferred_logic.rb +3 -4
  41. data/lib/aspector/deferred_option.rb +5 -10
  42. data/lib/aspector/interception.rb +356 -0
  43. data/lib/aspector/logger.rb +18 -45
  44. data/lib/aspector/logging.rb +10 -29
  45. data/lib/aspector/method_matcher.rb +5 -6
  46. data/lib/aspector/object_extension.rb +4 -12
  47. data/lib/aspector/version.rb +3 -0
  48. data/spec/examples_spec.rb +59 -0
  49. data/spec/functionals/aspect_for_multiple_targets_spec.rb +54 -0
  50. data/spec/functionals/aspect_interception_options_accessing_spec.rb +112 -0
  51. data/spec/functionals/aspect_on_a_class_spec.rb +159 -0
  52. data/spec/functionals/aspect_on_an_instance_spec.rb +66 -0
  53. data/spec/functionals/aspector_spec.rb +138 -0
  54. data/spec/functionals/aspects_combined_spec.rb +37 -0
  55. data/spec/functionals/aspects_execution_order_spec.rb +61 -0
  56. data/spec/functionals/aspects_on_private_methods_spec.rb +82 -0
  57. data/spec/spec_helper.rb +20 -21
  58. data/spec/support/class_builder.rb +44 -0
  59. data/spec/units/advice_spec.rb +49 -0
  60. data/spec/units/advices/after_spec.rb +328 -0
  61. data/spec/units/advices/around_spec.rb +336 -0
  62. data/spec/units/advices/before_filter_spec.rb +287 -0
  63. data/spec/units/advices/before_spec.rb +237 -0
  64. data/spec/units/advices/raw_spec.rb +67 -0
  65. data/spec/units/base_class_methods_spec.rb +262 -0
  66. data/spec/units/base_spec.rb +133 -0
  67. data/spec/units/deferred_logic_spec.rb +35 -0
  68. data/spec/units/logger_spec.rb +20 -0
  69. data/spec/units/logging_spec.rb +85 -0
  70. data/spec/units/method_matcher_spec.rb +95 -0
  71. data/spec/units/object_extension_spec.rb +11 -0
  72. data/spec/units/special_chars_spec.rb +128 -0
  73. metadata +98 -246
  74. data/.document +0 -5
  75. data/.rvmrc +0 -8
  76. data/README.rdoc +0 -80
  77. data/VERSION +0 -1
  78. data/performance-tests/after_test.rb +0 -25
  79. data/performance-tests/around_advice_benchmark.rb +0 -66
  80. data/performance-tests/around_test.rb +0 -27
  81. data/performance-tests/before_test.rb +0 -25
  82. data/performance-tests/combined_test.rb +0 -33
  83. data/performance-tests/method_invocation_test.rb +0 -25
  84. data/performance-tests/raw_test.rb +0 -37
  85. data/performance-tests/test_helper.rb +0 -9
  86. data/run_all_examples.sh +0 -12
  87. data/spec/functional/advices_on_private_methods_spec.rb +0 -21
  88. data/spec/functional/aspect_on_eigen_class_spec.rb +0 -72
  89. data/spec/functional/aspect_on_object_spec.rb +0 -20
  90. data/spec/functional/aspector_spec.rb +0 -140
  91. data/spec/functional/aspects_combined_spec.rb +0 -48
  92. data/spec/functional/execution_order_spec.rb +0 -42
  93. data/spec/unit/advice_spec.rb +0 -4
  94. data/spec/unit/after_spec.rb +0 -88
  95. data/spec/unit/around_spec.rb +0 -76
  96. data/spec/unit/base_class_methods_spec.rb +0 -28
  97. data/spec/unit/base_spec.rb +0 -112
  98. data/spec/unit/before_spec.rb +0 -125
  99. data/spec/unit/deferred_logic_spec.rb +0 -23
  100. data/spec/unit/method_matcher_spec.rb +0 -43
  101. data/spec/unit/raw_spec.rb +0 -53
  102. data/spec/unit/special_chars_spec.rb +0 -122
@@ -1,44 +1,36 @@
1
- class A
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'aspector'
2
3
 
3
- def test input
4
+ # Example class to which we will apply our aspects
5
+ class ExampleClass
6
+ def test(input)
4
7
  input.upcase
5
8
  end
6
-
7
9
  end
8
10
 
9
- ##############################
10
-
11
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
12
-
13
- require 'aspector'
14
-
11
+ # Aspect used as a logging hookup
15
12
  class LoggingAspect < Aspector::Base
16
-
17
13
  ALL_METHODS = /.*/
18
14
 
19
- around ALL_METHODS, :except => :class, :method_arg => true do |method, proxy, *args, &block|
15
+ around ALL_METHODS, except: :class, method_arg: true do |method, proxy, *args, &block|
20
16
  class_method = "#{self.class}.#{method}"
21
17
  puts "Entering #{class_method}: #{args.join(',')}"
22
- result = proxy.call *args, &block
18
+ result = proxy.call(*args, &block)
23
19
  puts "Exiting #{class_method}: #{result}"
24
20
  result
25
21
  end
26
-
27
22
  end
28
23
 
29
- ##############################
30
-
31
- LoggingAspect.apply(A)
32
- puts "LoggingAspect is applied"
24
+ LoggingAspect.apply(ExampleClass)
25
+ puts 'LoggingAspect is applied'
33
26
 
34
- a = A.new
35
- a.test 'input'
27
+ instance = ExampleClass.new
28
+ instance.test 'input'
36
29
 
37
30
  LoggingAspect.disable
38
- puts "LoggingAspect is disabled"
39
- a.test 'input'
31
+ puts 'LoggingAspect is disabled'
32
+ instance.test 'input'
40
33
 
41
34
  LoggingAspect.enable
42
- puts "LoggingAspect is enabled"
43
- a.test 'input'
44
-
35
+ puts 'LoggingAspect is enabled'
36
+ instance.test 'input'
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'aspector'
3
+
4
+ # Aspect used to provide process logging
5
+ class ProcessLogging < Aspector::Base
6
+ after :spawn do |return_value, *args|
7
+ $stderr.puts args[0].inspect
8
+ return_value
9
+ end
10
+ end
11
+
12
+ ProcessLogging.apply(Process, class_methods: true)
13
+ Process.spawn('pwd')
@@ -1,41 +1,41 @@
1
- class A
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'aspector'
2
3
 
4
+ # Example class to which we will apply our aspects
5
+ class ExampleClass
3
6
  def test
4
7
  puts 'test'
5
- raise
8
+ fail
6
9
  end
7
-
8
10
  end
9
11
 
10
- ##############################
11
-
12
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
-
14
- require 'aspector'
15
-
12
+ # Aspect that will be used as a retry with counting
16
13
  class RetryAspect < Aspector::Base
17
-
18
14
  target do
19
- def retry_this proxy, &block
20
- proxy.call &block
21
- rescue => e
15
+ def retry_this(proxy, &block)
16
+ proxy.call(&block)
17
+ rescue
22
18
  @retry_count ||= 3
23
19
  @retry_count -= 1
24
20
 
25
- @retry_count = nil or raise if @retry_count == 0
21
+ if @retry_count == 0
22
+ @retry_count = nil
23
+ raise
24
+ end
26
25
 
27
26
  retry
28
27
  end
29
28
  end
30
29
 
31
30
  around :retry_this
32
-
33
31
  end
34
32
 
35
- ##############################
36
-
37
- RetryAspect.apply A, :method => "test"
33
+ RetryAspect.apply(ExampleClass, method: :test)
38
34
 
39
- a = A.new
40
- a.test
35
+ instance = ExampleClass.new
41
36
 
37
+ begin
38
+ instance.test
39
+ rescue
40
+ puts 'Fails after 3 retries'
41
+ end
@@ -1,16 +1,18 @@
1
- require 'aspector/logging'
2
- require 'aspector/logger'
3
-
4
- require 'aspector/object_extension'
5
- require 'aspector/module_extension'
6
-
7
- require 'aspector/base'
8
- require 'aspector/base_class_methods'
9
- require 'aspector/advice'
10
- require 'aspector/advice_metadata'
11
- require 'aspector/method_matcher'
12
- require 'aspector/deferred_logic'
13
- require 'aspector/deferred_option'
14
-
15
- require 'aspector/aspect_instances'
1
+ require 'logger'
16
2
 
3
+ %w(
4
+ version
5
+ logging
6
+ logger
7
+ object_extension
8
+ module_extension
9
+ advice
10
+ advice_metadata
11
+ interception
12
+ base
13
+ base_class_methods
14
+ method_matcher
15
+ deferred_logic
16
+ deferred_option
17
+ aspect_instances
18
+ ).each { |scope| require "aspector/#{scope}" }
@@ -1,92 +1,79 @@
1
1
  module Aspector
2
+ # A single aspect advice representation
2
3
  class Advice
4
+ # All available advices types that we support
5
+ TYPES = %i(
6
+ before
7
+ before_filter
8
+ after
9
+ around
10
+ raw
11
+ )
12
+
13
+ # Defines methods that allow us to check if an advice is of a given type
14
+ TYPES.each do |type_name|
15
+ # Defines constants like BEFORE, AFTER,etc
16
+ const_set(type_name.to_s.upcase, type_name)
17
+
18
+ # @return [Boolean] is advice of a given type?
19
+ # @example Check if advice is an after
20
+ # advice.after? #=> true
21
+ define_method :"#{type_name}?" do
22
+ type == type_name
23
+ end
24
+ end
3
25
 
4
- BEFORE = 1
5
- AFTER = 2
6
- AROUND = 3
7
- RAW = 4
8
-
9
- attr_reader :type, :method_matcher, :options, :advice_code, :advice_block
26
+ attr_reader :type, :method_matcher, :options, :advice_code, :advice_block, :name
10
27
  attr_accessor :index
11
28
 
12
- def initialize parent, type, method_matcher, with_method, options = {}, &block
13
- @parent = parent
14
- @type = type
29
+ def initialize(parent, type, method_matcher, with_method, options = {}, &block)
30
+ @type = type
31
+ @parent = parent
32
+ @options = options
33
+ @advice_block = block
15
34
  @method_matcher = method_matcher
35
+ @name = @options[:name] || "advice_#{index}"
16
36
 
17
37
  if with_method.is_a? Symbol
18
- @with_method = with_method
38
+ @with_method = with_method
19
39
  else
20
- @advice_code = with_method
40
+ @advice_code = with_method
21
41
  end
22
-
23
- @options = options
24
- @advice_block = block
25
- end
26
-
27
- def name
28
- @options[:name] || "advice #{index}"
29
42
  end
30
43
 
31
44
  def with_method
32
- unless @advice_code
33
- @with_method ||= "aop_#{hash.abs}"
34
- end
45
+ return nil if @advice_code
46
+
47
+ @with_method ||= "aop_#{hash.abs}"
35
48
  end
36
49
 
37
- def match? method, context = nil
38
- return if method == with_method
39
- return unless @method_matcher.match?(method, context)
50
+ def match?(method, context = nil)
51
+ return false if method == with_method
52
+ return false unless @method_matcher.match?(method, context)
40
53
 
41
54
  return true unless @options[:except]
42
55
 
43
56
  @except ||= MethodMatcher.new(@options[:except])
44
57
 
45
- not @except.match?(method)
46
- end
47
-
48
- def raw?
49
- type == RAW
58
+ !@except.match?(method)
50
59
  end
51
60
 
52
- def before?
53
- type == BEFORE
54
- end
55
-
56
- def after?
57
- type == AFTER
58
- end
59
-
60
- def around?
61
- type == AROUND
62
- end
63
-
64
- def type_name
65
- case @type
66
- when BEFORE then @options[:skip_if_false] ? "BEFORE_FILTER" : "BEFORE"
67
- when AFTER then "AFTER"
68
- when AROUND then "AROUND"
69
- when RAW then "RAW"
70
- else "UNKNOWN?!"
71
- end
72
- end
73
-
74
- def use_deferred_logic? logic
61
+ def use_deferred_logic?(logic)
75
62
  method_matcher.use_deferred_logic? logic
76
63
  end
77
64
 
78
65
  def to_s
79
66
  s = "#{name}: "
80
- s << type_name
81
- s << " [" << @method_matcher.to_s << "] DO "
67
+ s << type.to_s.upcase
68
+ s << ' [' << @method_matcher.to_s << '] DO '
69
+
82
70
  if @with_method
83
71
  s << @with_method.to_s
84
72
  else
85
- s << "stuff in block"
73
+ s << 'stuff in block'
86
74
  end
87
- s << " WITH OPTIONS " << @options.inspect
75
+ s << ' WITH OPTIONS ' << @options.inspect
88
76
  s
89
77
  end
90
-
91
78
  end
92
79
  end
@@ -1,18 +1,17 @@
1
1
  module Aspector
2
+ # Metadata for Advice model
2
3
  class AdviceMetadata
3
- attr_reader :advice_type, :default_options, :mandatory_options
4
+ attr_reader :advice_type, :default_options
4
5
 
5
- def initialize advice_type, default_options, mandatory_options
6
- @advice_type = advice_type
7
- @default_options = default_options || {}
8
- @mandatory_options = mandatory_options || {}
6
+ def initialize(advice_type, default_options = {})
7
+ @advice_type = advice_type
8
+ @default_options = default_options
9
9
  end
10
10
 
11
- BEFORE = new Aspector::Advice::BEFORE, nil, :skip_if_false => false
12
- BEFORE_FILTER = new Aspector::Advice::BEFORE, nil, :skip_if_false => true
13
- AFTER = new Aspector::Advice::AFTER, { :result_arg => true }, nil
14
- AROUND = new Aspector::Advice::AROUND, nil, nil
15
- RAW = new Aspector::Advice::RAW, nil, nil
11
+ BEFORE = new Aspector::Advice::BEFORE
12
+ BEFORE_FILTER = new Aspector::Advice::BEFORE_FILTER
13
+ AFTER = new Aspector::Advice::AFTER, result_arg: true
14
+ AROUND = new Aspector::Advice::AROUND
15
+ RAW = new Aspector::Advice::RAW
16
16
  end
17
17
  end
18
-
@@ -1,12 +1,11 @@
1
1
  module Aspector
2
2
  class AspectInstances < Array
3
-
4
3
  def apply_to_method method
5
4
  each do |aspect_instance|
6
- next if aspect_instance.options[:old_methods_only]
5
+ next if aspect_instance.options[:existing_methods_only]
6
+
7
7
  aspect_instance.apply_to_method method
8
8
  end
9
9
  end
10
-
11
10
  end
12
11
  end
@@ -2,379 +2,17 @@ require 'erb'
2
2
 
3
3
  module Aspector
4
4
  class Base
5
-
6
- attr :target
7
- attr :options
8
-
9
- def initialize target, options = {}
10
- @target = target
11
-
12
- default_options = self.class.default_options
13
- if default_options and not default_options.empty?
14
- @options = default_options.merge(options)
15
- else
16
- @options = options
17
- end
18
-
19
- @wrapped_methods = {}
20
- end
21
-
22
5
  def disabled?
23
- # Enabled by default
24
- end
25
-
26
- def logger
27
- return @logger if @logger
28
-
29
- @logger = Logging.get_logger(self)
30
- @logger.level = self.class.logger.level
31
- @logger
32
- end
33
-
34
- def advices
35
- self.class.advices
36
- end
37
-
38
- def apply
39
- include_extension_module
40
- invoke_deferred_logics
41
- define_methods_for_advice_blocks
42
- add_to_instances unless @options[:old_methods_only]
43
- apply_to_methods unless @options[:new_methods_only]
44
- add_method_hooks unless @options[:old_methods_only]
45
- # TODO: clear deferred logic results if they are not used in any advice
6
+ false
46
7
  end
47
8
 
48
- def apply_to_methods
49
- return if advices.empty?
50
-
51
- # If method/methods option is set and all are String or Symbol, apply to those only, instead of
52
- # iterating through all methods
53
- methods = [@options[:method] || @options[:methods]]
54
- methods.compact!
55
- methods.flatten!
56
-
57
- if not methods.empty? and methods.all?{|method| method.is_a? String or method.is_a? Symbol }
58
- methods.each do |method|
59
- apply_to_method(method.to_s)
60
- end
61
-
62
- return
63
- end
64
-
65
- context.public_instance_methods.each do |method|
66
- apply_to_method(method.to_s, :public)
67
- end
68
-
69
- context.protected_instance_methods.each do |method|
70
- apply_to_method(method.to_s, :protected)
71
- end
72
-
73
- if @options[:private_methods]
74
- context.private_instance_methods.each do |method|
75
- apply_to_method(method.to_s, :private)
76
- end
77
- end
78
- end
79
-
80
- def apply_to_method method, scope = nil
81
- filtered_advices = filter_advices advices, method
82
- return if filtered_advices.empty?
83
-
84
- logger.log Logging::DEBUG, 'apply-to-method', method
85
-
86
- scope ||=
87
- if context.private_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
88
- :private
89
- elsif context.protected_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
90
- :protected
91
- else
92
- :public
93
- end
94
-
95
- recreate_method method, filtered_advices, scope
96
- end
97
-
98
- private
99
-
100
- def include_extension_module
101
- if self.class.const_defined?(:ToBeIncluded)
102
- context.send(:include, self.class.const_get(:ToBeIncluded))
103
- end
104
- end
105
-
106
- def deferred_logic_results logic
107
- @deferred_logic_results[logic]
108
- end
109
-
110
- def get_wrapped_method_of method
111
- @wrapped_methods[method]
112
- end
113
-
114
- # context is where advices will be applied (i.e. where methods are modified), can be different from target
115
- def context
116
- return @target if @target.is_a?(Module) and not @options[:class_methods]
117
-
118
- class << @target
119
- self
120
- end
121
- end
122
-
123
- def invoke_deferred_logics
124
- return unless (logics = self.class.send :_deferred_logics_)
125
-
126
- logics.each do |logic|
127
- result = logic.apply context, self
128
- if advices.detect {|advice| advice.use_deferred_logic? logic }
129
- @deferred_logic_results ||= {}
130
- @deferred_logic_results[logic] = result
131
- end
132
- end
133
- end
134
-
135
- def define_methods_for_advice_blocks
136
- advices.each do |advice|
137
- next if advice.raw?
138
- next unless advice.advice_block
139
- context.send :define_method, advice.with_method, advice.advice_block
140
- context.send :private, advice.with_method
141
- end
142
- end
143
-
144
- def add_to_instances
145
- return if advices.empty?
146
-
147
- aspect_instances = context.instance_variable_get(:@aop_instances)
148
- unless aspect_instances
149
- aspect_instances = AspectInstances.new
150
- context.instance_variable_set(:@aop_instances, aspect_instances)
151
- end
152
- aspect_instances << self
153
- end
154
-
155
- def add_method_hooks
156
- return if advices.empty?
157
-
158
- if @options[:class_methods]
159
- return unless @target.is_a?(Module)
160
-
161
- eigen_class = class << @target; self; end
162
- orig_singleton_method_added = @target.method(:singleton_method_added)
163
-
164
- eigen_class.send :define_method, :singleton_method_added do |method|
165
- aop_singleton_method_added(method) do
166
- orig_singleton_method_added.call(method)
167
- end
168
- end
169
- else
170
- eigen_class = class << @target; self; end
171
-
172
- if @target.is_a? Module
173
- orig_method_added = @target.method(:method_added)
174
- else
175
- orig_method_added = eigen_class.method(:method_added)
176
- end
177
-
178
- eigen_class.send :define_method, :method_added do |method|
179
- aop_method_added(method) do
180
- orig_method_added.call(method)
181
- end
182
- end
183
- end
184
- end
185
-
186
- def filter_advices advices, method
187
- advices.select do |advice|
188
- advice.match?(method, self)
189
- end
190
- end
191
-
192
- def recreate_method method, advices, scope
193
- context.instance_variable_set(:@aop_creating_method, true)
194
-
195
- raw_advices = advices.select {|advice| advice.raw? }
196
-
197
- if raw_advices.size > 0
198
- raw_advices.each do |advice|
199
- if @target.is_a? Module and not @options[:class_methods]
200
- @target.class_exec method, self, &advice.advice_block
201
- else
202
- @target.instance_exec method, self, &advice.advice_block
203
- end
204
- end
205
-
206
- return if raw_advices.size == advices.size
207
- end
208
-
209
- begin
210
- @wrapped_methods[method] = context.instance_method(method)
211
- rescue
212
- # ignore undefined method error
213
- if @options[:old_methods_only]
214
- logger.log Logging::WARN, 'method-not-found', method
215
- end
216
-
217
- return
218
- end
219
-
220
- before_advices = advices.select {|advice| advice.before? }
221
- after_advices = advices.select {|advice| advice.after? }
222
- around_advices = advices.select {|advice| advice.around? }
223
-
224
- (around_advices.size - 1).downto(1) do |i|
225
- advice = around_advices[i]
226
- recreate_method_with_advices method, [], [], advice
9
+ def apply target, options = {}
10
+ default_options = self.class.default_options
11
+ if default_options and not default_options.empty?
12
+ options = default_options.merge(options)
227
13
  end
228
14
 
229
- recreate_method_with_advices method, before_advices, after_advices, around_advices.first, true
230
-
231
- context.send scope, method if scope != :public
232
- ensure
233
- context.send :remove_instance_variable, :@aop_creating_method
15
+ Interception.new(self, target, options).apply
234
16
  end
235
-
236
- def recreate_method_with_advices method, before_advices, after_advices, around_advice, is_outermost = false
237
- aspect = self
238
-
239
- code = METHOD_TEMPLATE.result(binding)
240
- aspect.logger.log Logging::DEBUG, 'generate-code', method, code
241
- context.class_eval code, __FILE__, __LINE__ + 4
242
- end
243
-
244
- METHOD_TEMPLATE = ERB.new <<-CODE, nil, "%<>"
245
-
246
- orig_method = aspect.send :get_wrapped_method_of, '<%= method %>'
247
- % if around_advice
248
- wrapped_method = instance_method(:<%= method %>)
249
- % end
250
-
251
- define_method :<%= method %> do |*args, &block|
252
- % if logger.visible?(Logging::TRACE)
253
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'enter-generated-method'
254
- % end
255
-
256
- if aspect.disabled?
257
- % if logger.visible?(Logging::TRACE)
258
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit--generated-method'
259
- % end
260
- return orig_method.bind(self).call(*args, &block)
261
- end
262
-
263
- % if is_outermost
264
- result = catch(:returns) do
265
- % end
266
-
267
- % before_advices.each do |advice|
268
- # Before advice: <%= advice.name %>
269
- % if logger.visible?(Logging::TRACE)
270
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<%= advice.name %>'
271
- % end
272
- % if advice.advice_code
273
- result = (<%= advice.advice_code %>)
274
- % else
275
- result = <%= advice.with_method %> <%
276
- if advice.options[:aspect_arg] %>aspect, <% end %><%
277
- if advice.options[:method_arg] %>'<%= method %>', <% end
278
- %>*args
279
- % end
280
- % if logger.visible?(Logging::TRACE)
281
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<%= advice.name %>'
282
- % end
283
- % if advice.options[:skip_if_false]
284
- unless result
285
- % if logger.visible?(Logging::TRACE)
286
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit-method-due-to-before-filter', '<%= advice.name %>'
287
- % end
288
- return
289
- end
290
- % end
291
- % end
292
-
293
- % if around_advice
294
- # Around advice: <%= around_advice.name %>
295
- % if logger.visible?(Logging::TRACE)
296
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<%= around_advice.name %>'
297
- % end
298
- % if around_advice.advice_code
299
- result = (<%= around_advice.advice_code.gsub('INVOKE_PROXY', 'wrapped_method.bind(self).call(*args, &block)') %>)
300
-
301
- % else
302
- % if logger.visible?(Logging::TRACE)
303
- proxy = lambda do |*args, &block|
304
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-proxy'
305
- res = wrapped_method.bind(self).call *args, &block
306
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-proxy'
307
- res
308
- end
309
- result = <%= around_advice.with_method %> <%
310
- if around_advice.options[:aspect_arg] %>aspect, <% end %><%
311
- if around_advice.options[:method_arg] %>'<%= method %>', <% end
312
- %>proxy, *args, &block
313
- % else
314
- result = <%= around_advice.with_method %> <%
315
- if around_advice.options[:aspect_arg] %>aspect, <% end %><%
316
- if around_advice.options[:method_arg] %>'<%= method %>', <% end
317
- %>wrapped_method.bind(self), *args, &block
318
- % end
319
- % end
320
- % if logger.visible?(Logging::TRACE)
321
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<%= around_advice.name %>'
322
- % end
323
-
324
- % else
325
-
326
- # Invoke original method
327
- % if logger.visible?(Logging::TRACE)
328
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-wrapped-method'
329
- % end
330
- result = orig_method.bind(self).call *args, &block
331
- % if logger.visible?(Logging::TRACE)
332
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--wrapped-method'
333
- % end
334
-
335
- % end
336
-
337
- % unless after_advices.empty?
338
- % after_advices.each do |advice|
339
- # After advice: <%= advice.name %>
340
- % if logger.visible?(Logging::TRACE)
341
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<%= advice.name %>'
342
- % end
343
- % if advice.advice_code
344
- result = (<%= advice.advice_code %>)
345
- % else
346
- % if advice.options[:result_arg]
347
- result = <%= advice.with_method %> <%
348
- if advice.options[:aspect_arg] %>aspect, <% end %><%
349
- if advice.options[:method_arg] %>'<%= method %>', <% end %><%
350
- if advice.options[:result_arg] %>result, <% end
351
- %>*args
352
- % else
353
- <%= advice.with_method %> <%
354
- if advice.options[:aspect_arg] %>aspect, <% end %><%
355
- if advice.options[:method_arg] %>'<%= method %>', <% end
356
- %>*args
357
- % end
358
- % end
359
- % if logger.visible?(Logging::TRACE)
360
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<%= advice.name %>'
361
- % end
362
- % end
363
- % end
364
-
365
- % if is_outermost
366
- result
367
-
368
- end # end of catch
369
- % end
370
-
371
- % if logger.visible?(Logging::TRACE)
372
- aspect.logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit--generated-method'
373
- % end
374
- result
375
- end
376
- CODE
377
-
378
17
  end
379
18
  end
380
-