aspector 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
data/aspector.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "aspector"
8
- s.version = "0.8.0"
8
+ s.version = "0.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Guoliang Cao"]
12
- s.date = "2012-02-14"
12
+ s.date = "2012-03-08"
13
13
  s.description = ""
14
14
  s.email = "gcao99@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -48,8 +48,8 @@ Gem::Specification.new do |s|
48
48
  "lib/aspector/method_matcher.rb",
49
49
  "lib/aspector/module_extension.rb",
50
50
  "lib/aspector/object_extension.rb",
51
- "lib/aspector/return_this.rb",
52
51
  "performance-tests/after_test.rb",
52
+ "performance-tests/around_advice_benchmark.rb",
53
53
  "performance-tests/around_test.rb",
54
54
  "performance-tests/before_test.rb",
55
55
  "performance-tests/combined_test.rb",
@@ -1,6 +1,8 @@
1
1
  class A
2
2
  def test
3
- puts 'test'
3
+ puts 'test 1'
4
+ yield
5
+ puts 'test 2'
4
6
  end
5
7
  end
6
8
 
@@ -12,25 +14,27 @@ require 'aspector'
12
14
 
13
15
  aspector(A) do
14
16
  target do
15
- def do_this &block
17
+ def do_this proxy, &block
16
18
  puts 'before'
17
- block.call
19
+ proxy.call &block
18
20
  puts 'after'
19
21
  end
20
22
  end
21
23
 
22
24
  around :test, :do_this
23
25
 
24
- around :test do |&block|
26
+ around :test do |proxy, &block|
25
27
  puts 'before(block)'
26
- block.call
28
+ proxy.call &block
27
29
  puts 'after(block)'
28
30
  end
29
31
  end
30
32
 
31
33
  ##############################
32
34
 
33
- A.new.test
35
+ A.new.test do
36
+ puts 'in block'
37
+ end
34
38
 
35
39
  # Expected output:
36
40
  # before
@@ -48,12 +48,12 @@ class CacheAspect < Aspector::Base
48
48
 
49
49
  def after_initialize
50
50
  aspect = self
51
- around options[:method], :method_name_arg => true do |method, &block|
51
+ around options[:method], :method_name_arg => true do |method, proxy, &block|
52
52
  key = method
53
53
  ttl = aspect.options[:ttl]
54
54
 
55
55
  SimpleCache.cache key, ttl do
56
- block.call
56
+ proxy.call &block
57
57
  end
58
58
  end
59
59
  end
@@ -15,8 +15,8 @@ require 'aspector'
15
15
  class ExceptionHandler < Aspector::Base
16
16
 
17
17
  target do
18
- def handle_exception *args, &block
19
- block.call *args
18
+ def handle_exception proxy, *args, &block
19
+ proxy.call *args, &block
20
20
  rescue => e
21
21
  puts "Rescued: #{e}"
22
22
  end
@@ -16,10 +16,10 @@ class LoggingAspect < Aspector::Base
16
16
 
17
17
  ALL_METHODS = /.*/
18
18
 
19
- around ALL_METHODS, :except => :class, :method_name_arg => true do |method, *args, &block|
19
+ around ALL_METHODS, :except => :class, :method_name_arg => true do |method, proxy, *args, &block|
20
20
  class_method = "#{self.class}.#{method}"
21
21
  puts "Entering #{class_method}: #{args.join(',')}"
22
- result = block.call *args
22
+ result = proxy.call *args, &block
23
23
  puts "Exiting #{class_method}: #{result}"
24
24
  result
25
25
  end
@@ -29,7 +29,16 @@ end
29
29
  ##############################
30
30
 
31
31
  LoggingAspect.apply(A)
32
+ puts "LoggingAspect is applied"
32
33
 
33
34
  a = A.new
34
35
  a.test 'input'
35
36
 
37
+ LoggingAspect.disable
38
+ puts "LoggingAspect is disabled"
39
+ a.test 'input'
40
+
41
+ LoggingAspect.enable
42
+ puts "LoggingAspect is enabled"
43
+ a.test 'input'
44
+
@@ -16,8 +16,8 @@ require 'aspector'
16
16
  class RetryAspect < Aspector::Base
17
17
 
18
18
  target do
19
- def retry_this &block
20
- block.call
19
+ def retry_this proxy, &block
20
+ proxy.call &block
21
21
  rescue => e
22
22
  @retry_count ||= 3
23
23
  @retry_count -= 1
@@ -3,7 +3,7 @@ module Aspector
3
3
 
4
4
  def apply_to_method method
5
5
  each do |aspect_instance|
6
- aspect_instance.send :aop_apply_to_method, method
6
+ aspect_instance.aop_apply_to_method method, aspect_instance.aop_advices
7
7
  end
8
8
  end
9
9
 
data/lib/aspector/base.rb CHANGED
@@ -6,6 +6,8 @@ module Aspector
6
6
  attr :aop_options
7
7
  alias :options :aop_options
8
8
 
9
+ attr :aop_wrapped_methods
10
+
9
11
  def initialize target, options = {}
10
12
  @aop_target = target
11
13
 
@@ -19,6 +21,8 @@ module Aspector
19
21
  # @aop_context is where advices will be applied (i.e. where methods are modified), can be different from target
20
22
  @aop_context = aop_get_context
21
23
 
24
+ @aop_wrapped_methods = {}
25
+
22
26
  after_initialize
23
27
  end
24
28
 
@@ -47,6 +51,43 @@ module Aspector
47
51
  end
48
52
  alias :apply :aop_apply
49
53
 
54
+ def aop_apply_to_methods
55
+ advices = aop_advices
56
+ @aop_context.public_instance_methods.each do |method|
57
+ aop_apply_to_method(method.to_s, advices, :public)
58
+ end
59
+
60
+ @aop_context.protected_instance_methods.each do |method|
61
+ aop_apply_to_method(method.to_s, advices, :protected)
62
+ end
63
+
64
+ if @aop_options[:private_methods]
65
+ @aop_context.private_instance_methods.each do |method|
66
+ aop_apply_to_method(method.to_s, advices, :private)
67
+ end
68
+ end
69
+ end
70
+
71
+ def aop_apply_to_method method, advices, scope = nil
72
+ advices = aop_filter_advices advices, method
73
+ return if advices.empty?
74
+
75
+ before_apply_to_method method, advices
76
+
77
+ scope ||=
78
+ if @aop_context.private_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
79
+ :private
80
+ elsif @aop_context.protected_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
81
+ :protected
82
+ else
83
+ :public
84
+ end
85
+
86
+ aop_recreate_method method, advices, scope
87
+
88
+ after_apply_to_method method, advices
89
+ end
90
+
50
91
  protected
51
92
 
52
93
  # Hook method that runs after an aspect is instantiated
@@ -97,42 +138,6 @@ module Aspector
97
138
  @aop_deferred_logic_results[logic]
98
139
  end
99
140
 
100
- def aop_apply_to_methods
101
- @aop_context.public_instance_methods.each do |method|
102
- aop_apply_to_method(method.to_s, :public)
103
- end
104
-
105
- @aop_context.protected_instance_methods.each do |method|
106
- aop_apply_to_method(method.to_s, :protected)
107
- end
108
-
109
- if @aop_options[:private_methods]
110
- @aop_context.private_instance_methods.each do |method|
111
- aop_apply_to_method(method.to_s, :private)
112
- end
113
- end
114
- end
115
-
116
- def aop_apply_to_method method, scope = nil
117
- advices = aop_advices_for_method method
118
- return if advices.empty?
119
-
120
- before_apply_to_method method, advices
121
-
122
- scope ||=
123
- if @aop_context.private_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
124
- :private
125
- elsif @aop_context.protected_instance_methods.include?(RUBY_VERSION.index('1.9') ? method.to_sym : method.to_s)
126
- :protected
127
- else
128
- :public
129
- end
130
-
131
- aop_recreate_method method, advices, scope
132
-
133
- after_apply_to_method method, advices
134
- end
135
-
136
141
  def aop_get_context
137
142
  return @aop_target if @aop_target.is_a?(Module) and not @aop_options[:eigen_class]
138
143
 
@@ -196,44 +201,54 @@ module Aspector
196
201
  end
197
202
  end
198
203
 
199
- def aop_advices_for_method method
200
- aop_advices.select do |advice|
204
+ def aop_filter_advices advices, method
205
+ advices.select do |advice|
201
206
  advice.match?(method, self)
202
207
  end
203
208
  end
204
209
 
205
210
  def aop_recreate_method method, advices, scope
211
+ @aop_wrapped_methods[method] = @aop_context.instance_method(method)
206
212
  @aop_context.instance_variable_set(:@aop_creating_method, true)
207
213
 
208
214
  before_advices = advices.select {|advice| advice.before? }
209
215
  after_advices = advices.select {|advice| advice.after? }
210
216
  around_advices = advices.select {|advice| advice.around? }
211
217
 
212
- if around_advices.size > 1
213
- (around_advices.size - 1).downto(1) do |i|
214
- advice = around_advices[i]
215
- aop_recreate_method_with_advices method, [], [], advice
216
- end
218
+ (around_advices.size - 1).downto(1) do |i|
219
+ advice = around_advices[i]
220
+ aop_recreate_method_with_advices method, [], [], advice
217
221
  end
218
222
 
219
- aop_recreate_method_with_advices method, before_advices, after_advices, around_advices.first
223
+ aop_recreate_method_with_advices method, before_advices, after_advices, around_advices.first, true
220
224
 
221
225
  @aop_context.send scope, method if scope != :public
222
226
  ensure
223
227
  @aop_context.instance_variable_set(:@aop_creating_method, nil)
224
228
  end
225
229
 
226
- def aop_recreate_method_with_advices method, before_advices, after_advices, around_advice
230
+ def aop_recreate_method_with_advices method, before_advices, after_advices, around_advice, is_outermost = false
231
+ aspect = self
232
+
227
233
  code = METHOD_TEMPLATE.result(binding)
228
234
  #puts code
229
235
  @aop_context.class_eval code, __FILE__, __LINE__ + 4
230
236
  end
231
237
 
232
238
  METHOD_TEMPLATE = ERB.new <<-CODE
233
- target = self
239
+ orig_method = aspect.aop_wrapped_methods['<%= method %>']
240
+
241
+ <% if around_advice %>
234
242
  wrapped_method = instance_method(:<%= method %>)
243
+ <% end %>
235
244
 
236
245
  define_method :<%= method %> do |*args, &block|
246
+ return orig_method.bind(self).call(*args, &block) if aspect.class.aop_disabled?
247
+
248
+ <% if is_outermost %>
249
+ catch(:aop_return) do
250
+ <% end %>
251
+
237
252
  # Before advices
238
253
  <% before_advices.each do |advice|
239
254
  if advice.options[:method_name_arg] %>
@@ -242,27 +257,23 @@ module Aspector
242
257
  result = <%= advice.with_method %> *args
243
258
  <% end %>
244
259
 
245
- return result.value if result.is_a? ::Aspector::ReturnThis
246
260
  <% if advice.options[:skip_if_false] %>
247
261
  return unless result
248
262
  <% end
249
263
  end
250
264
  %>
251
265
 
252
- <% if around_advice
253
- if around_advice.options[:method_name_arg] %>
254
- result = <%= around_advice.with_method %> '<%= method %>', *args do |*args|
255
- wrapped_method.bind(self).call *args, &block
256
- end
266
+ <% if around_advice %>
267
+ # Around advice
268
+ <% if around_advice.options[:method_name_arg] %>
269
+ result = <%= around_advice.with_method %> '<%= method %>', wrapped_method.bind(self), *args, &block
257
270
  <% else %>
258
- result = <%= around_advice.with_method %> *args do |*args|
259
- wrapped_method.bind(self).call *args, &block
260
- end
271
+ result = <%= around_advice.with_method %> wrapped_method.bind(self), *args, &block
261
272
  <% end
262
273
  else
263
274
  %>
264
- # Invoke wrapped method
265
- result = wrapped_method.bind(self).call *args, &block
275
+ # Invoke original method
276
+ result = orig_method.bind(self).call *args, &block
266
277
  <% end %>
267
278
 
268
279
  # After advices
@@ -285,6 +296,10 @@ module Aspector
285
296
  %>
286
297
  result
287
298
  <% end %>
299
+
300
+ <% if is_outermost %>
301
+ end
302
+ <% end %>
288
303
  end
289
304
  CODE
290
305
 
@@ -3,6 +3,21 @@ module Aspector
3
3
  module ClassMethods
4
4
  ::Aspector::Base.extend(self)
5
5
 
6
+ def aop_enable
7
+ @aop_disabled = nil
8
+ end
9
+ alias :enable :aop_enable
10
+
11
+ def aop_disable
12
+ @aop_disabled = true
13
+ end
14
+ alias :disable :aop_disable
15
+
16
+ def aop_disabled?
17
+ @aop_disabled
18
+ end
19
+ alias :disabled? :aop_disabled?
20
+
6
21
  def aop_advices
7
22
  @aop_advices ||= []
8
23
  end
@@ -9,17 +9,17 @@ module Aspector
9
9
  @aop_creating_method or
10
10
  @aop_instances.nil? or @aop_instances.empty?
11
11
 
12
- aspects_applied_flag = :"@aop_applied_#{method}"
13
- return (block_given? and yield) if instance_variable_get(aspects_applied_flag)
12
+ aop_applied_flag = :"@aop_applied_#{method}"
13
+ return (block_given? and yield) if instance_variable_get(aop_applied_flag)
14
14
 
15
15
  begin
16
- instance_variable_set(aspects_applied_flag, true)
16
+ instance_variable_set(aop_applied_flag, true)
17
17
 
18
18
  @aop_instances.apply_to_method(method.to_s)
19
19
 
20
20
  yield if block_given?
21
21
  ensure
22
- instance_variable_set(aspects_applied_flag, nil)
22
+ instance_variable_set(aop_applied_flag, nil)
23
23
  end
24
24
  end
25
25
 
@@ -29,20 +29,20 @@ module Aspector
29
29
 
30
30
  return (block_given? and yield) if eigen_class.instance_variable_get(:@aop_creating_method)
31
31
 
32
- aspect_instances = eigen_class.instance_variable_get(:@aop_instances)
33
- return (block_given? and yield) if aspect_instances.nil? or aspect_instances.empty?
32
+ aop_instances = eigen_class.instance_variable_get(:@aop_instances)
33
+ return (block_given? and yield) if aop_instances.nil? or aop_instances.empty?
34
34
 
35
- aspects_applied_flag = :"@aop_applied_#{method}"
36
- return (block_given? and yield) if eigen_class.instance_variable_get(aspects_applied_flag)
35
+ aop_applied_flag = :"@aop_applied_#{method}"
36
+ return (block_given? and yield) if eigen_class.instance_variable_get(aop_applied_flag)
37
37
 
38
38
  begin
39
- eigen_class.instance_variable_set(aspects_applied_flag, true)
39
+ eigen_class.instance_variable_set(aop_applied_flag, true)
40
40
 
41
- aspect_instances.apply_to_method(method.to_s)
41
+ aop_instances.apply_to_method(method.to_s)
42
42
 
43
43
  yield if block_given?
44
44
  ensure
45
- eigen_class.instance_variable_set(aspects_applied_flag, nil)
45
+ eigen_class.instance_variable_set(aop_applied_flag, nil)
46
46
  end
47
47
  end
48
48
 
@@ -1,6 +1,8 @@
1
1
  module Aspector
2
2
  module ObjectExtension
3
3
 
4
+ private
5
+
4
6
  def aspector *args, &block
5
7
  options = args.last.is_a?(Hash) ? args.pop : {}
6
8
 
@@ -19,7 +21,13 @@ module Aspector
19
21
  klass
20
22
  end
21
23
 
24
+ def aop_return value = nil
25
+ throw :aop_return, value
26
+ end
27
+ alias :returns :aop_return
28
+
22
29
  end
23
30
  end
24
31
 
25
32
  Object.send(:include, Aspector::ObjectExtension)
33
+
data/lib/aspector.rb CHANGED
@@ -11,4 +11,3 @@ require 'aspector/deferred_option'
11
11
 
12
12
  require 'aspector/aspect_instances'
13
13
 
14
- require 'aspector/return_this'
@@ -0,0 +1,65 @@
1
+ class A
2
+ def test input
3
+ input.upcase!
4
+ end
5
+ end
6
+
7
+ class B
8
+ def test input
9
+ input.upcase!
10
+ end
11
+ end
12
+
13
+ ##############################
14
+
15
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
16
+
17
+ require 'aspector'
18
+
19
+ class AroundAspect < Aspector::Base
20
+ around :test do |proxy, *args, &block|
21
+ begin
22
+ proxy.call *args, &block
23
+ rescue => e
24
+ end
25
+ end
26
+ end
27
+
28
+ class RawAspect < Aspector::Base
29
+ target do
30
+ wrapped_method = instance_method(:test)
31
+ define_method :test do |*args, &block|
32
+ begin
33
+ wrapped_method.bind(self).call *args, &block
34
+ rescue => e
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ ##############################
41
+
42
+ AroundAspect.apply(A)
43
+ RawAspect.apply(B)
44
+
45
+ a = A.new
46
+ b = B.new
47
+
48
+ require 'benchmark'
49
+
50
+ TIMES = 100000
51
+ Benchmark.bmbm do |x|
52
+ x.report "Around advice - good" do
53
+ TIMES.times { a.test 'good' }
54
+ end
55
+ x.report "Around advice - bad" do
56
+ TIMES.times { a.test nil }
57
+ end
58
+ x.report "Raw - good" do
59
+ TIMES.times { b.test 'good' }
60
+ end
61
+ x.report "Raw - bad" do
62
+ TIMES.times { b.test nil }
63
+ end
64
+ end
65
+
@@ -13,8 +13,8 @@ class AroundTest < Test::Unit::TestCase
13
13
 
14
14
  def test; end
15
15
 
16
- def around_test &block
17
- block.call
16
+ def around_test proxy, &block
17
+ proxy.call &block
18
18
  end
19
19
  end
20
20
 
@@ -22,9 +22,9 @@ describe "Aspector for eigen class" do
22
22
  result
23
23
  end
24
24
 
25
- around :test do |&block|
25
+ around :test do |proxy, &block|
26
26
  value << "do_around_before"
27
- result = block.call
27
+ result = proxy.call &block
28
28
  value << "do_around_after"
29
29
  result
30
30
  end
@@ -51,9 +51,9 @@ describe "Aspector for eigen class" do
51
51
  result
52
52
  end
53
53
 
54
- around :test do |&block|
54
+ around :test do |proxy, &block|
55
55
  value << "do_around_before"
56
- result = block.call
56
+ result = proxy.call &block
57
57
  value << "do_around_after"
58
58
  result
59
59
  end
@@ -12,9 +12,9 @@ describe "Aspector" do
12
12
  result
13
13
  end
14
14
 
15
- around :test do |&block|
15
+ around :test do |proxy, &block|
16
16
  value << "do_around_before"
17
- result = block.call
17
+ result = proxy.call &block
18
18
  value << "do_around_after"
19
19
  result
20
20
  end
@@ -39,9 +39,9 @@ describe "Aspector" do
39
39
  result
40
40
  end
41
41
 
42
- around(:test) do |&block|
42
+ around(:test) do |proxy, &block|
43
43
  value << "do_around_before(#{name})"
44
- result = block.call
44
+ result = proxy.call &block
45
45
  value << "do_around_after(#{name})"
46
46
  result
47
47
  end
@@ -12,9 +12,9 @@ describe "Aspects combined" do
12
12
  result
13
13
  end
14
14
 
15
- around :test do |&block|
15
+ around :test do |proxy, &block|
16
16
  value << "do_around_before"
17
- result = block.call
17
+ result = proxy.call &block
18
18
  value << "do_around_after"
19
19
  result
20
20
  end
@@ -28,9 +28,9 @@ describe "Aspects combined" do
28
28
  result
29
29
  end
30
30
 
31
- around :test do |&block|
31
+ around :test do |proxy, &block|
32
32
  value << "do_around_before2"
33
- result = block.call
33
+ result = proxy.call &block
34
34
  value << "do_around_after2"
35
35
  result
36
36
  end
@@ -12,9 +12,9 @@ describe "Aspect execution order" do
12
12
  result
13
13
  end
14
14
 
15
- around :test do |&block|
15
+ around :test do |proxy, &block|
16
16
  value << "do_around_before"
17
- result = block.call
17
+ result = proxy.call &block
18
18
  value << "do_around_after"
19
19
  result
20
20
  end
@@ -26,9 +26,9 @@ describe "Aspect execution order" do
26
26
  result
27
27
  end
28
28
 
29
- around :test do |&block|
29
+ around :test do |proxy, &block|
30
30
  value << "do_around_before2"
31
- result = block.call
31
+ result = proxy.call &block
32
32
  value << "do_around_after2"
33
33
  result
34
34
  end
@@ -3,9 +3,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
  describe "Around advices" do
4
4
  it "should work" do
5
5
  klass = create_test_class do
6
- def do_this &block
6
+ def do_this proxy, &block
7
7
  value << "before"
8
- result = block.call
8
+ result = proxy.call &block
9
9
  value << "after"
10
10
  result
11
11
  end
@@ -24,9 +24,9 @@ describe "Around advices" do
24
24
  klass = create_test_class
25
25
 
26
26
  aspector(klass) do
27
- around :test do |&block|
27
+ around :test do |proxy, &block|
28
28
  value << "before"
29
- result = block.call
29
+ result = proxy.call &block
30
30
  value << "after"
31
31
  result
32
32
  end
@@ -39,9 +39,9 @@ describe "Around advices" do
39
39
 
40
40
  it "method_name_arg" do
41
41
  klass = create_test_class do
42
- def do_this method, &block
42
+ def do_this method, proxy, &block
43
43
  value << "before(#{method})"
44
- result = block.call
44
+ result = proxy.call &block
45
45
  value << "after(#{method})"
46
46
  result
47
47
  end
metadata CHANGED
@@ -1,134 +1,187 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: aspector
3
- version: !ruby/object:Gem::Version
4
- version: 0.8.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 59
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Guoliang Cao
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-02-14 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rspec
16
- requirement: &2163247700 !ruby/object:Gem::Requirement
17
+
18
+ date: 2012-03-08 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ requirement: &id001 !ruby/object:Gem::Requirement
17
22
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ hash: 3
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ version_requirements: *id001
31
+ name: rspec
23
32
  prerelease: false
24
- version_requirements: *2163247700
25
- - !ruby/object:Gem::Dependency
26
- name: jeweler
27
- requirement: &2163247120 !ruby/object:Gem::Requirement
33
+ type: :development
34
+ - !ruby/object:Gem::Dependency
35
+ requirement: &id002 !ruby/object:Gem::Requirement
28
36
  none: false
29
- requirements:
37
+ requirements:
30
38
  - - ~>
31
- - !ruby/object:Gem::Version
39
+ - !ruby/object:Gem::Version
40
+ hash: 7
41
+ segments:
42
+ - 1
43
+ - 6
44
+ - 4
32
45
  version: 1.6.4
33
- type: :development
46
+ version_requirements: *id002
47
+ name: jeweler
34
48
  prerelease: false
35
- version_requirements: *2163247120
36
- - !ruby/object:Gem::Dependency
37
- name: ruby-prof
38
- requirement: &2163246500 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
49
  type: :development
50
+ - !ruby/object:Gem::Dependency
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ version_requirements: *id003
61
+ name: ruby-prof
45
62
  prerelease: false
46
- version_requirements: *2163246500
47
- - !ruby/object:Gem::Dependency
48
- name: guard
49
- requirement: &2163245920 !ruby/object:Gem::Requirement
63
+ type: :development
64
+ - !ruby/object:Gem::Dependency
65
+ requirement: &id004 !ruby/object:Gem::Requirement
50
66
  none: false
51
- requirements:
67
+ requirements:
52
68
  - - ~>
53
- - !ruby/object:Gem::Version
69
+ - !ruby/object:Gem::Version
70
+ hash: 55
71
+ segments:
72
+ - 0
73
+ - 8
74
+ - 4
54
75
  version: 0.8.4
55
- type: :development
76
+ version_requirements: *id004
77
+ name: guard
56
78
  prerelease: false
57
- version_requirements: *2163245920
58
- - !ruby/object:Gem::Dependency
59
- name: guard-bundler
60
- requirement: &2163245340 !ruby/object:Gem::Requirement
79
+ type: :development
80
+ - !ruby/object:Gem::Dependency
81
+ requirement: &id005 !ruby/object:Gem::Requirement
61
82
  none: false
62
- requirements:
83
+ requirements:
63
84
  - - ~>
64
- - !ruby/object:Gem::Version
85
+ - !ruby/object:Gem::Version
86
+ hash: 29
87
+ segments:
88
+ - 0
89
+ - 1
90
+ - 3
65
91
  version: 0.1.3
66
- type: :development
92
+ version_requirements: *id005
93
+ name: guard-bundler
67
94
  prerelease: false
68
- version_requirements: *2163245340
69
- - !ruby/object:Gem::Dependency
70
- name: guard-rspec
71
- requirement: &2163244740 !ruby/object:Gem::Requirement
95
+ type: :development
96
+ - !ruby/object:Gem::Dependency
97
+ requirement: &id006 !ruby/object:Gem::Requirement
72
98
  none: false
73
- requirements:
99
+ requirements:
74
100
  - - ~>
75
- - !ruby/object:Gem::Version
101
+ - !ruby/object:Gem::Version
102
+ hash: 15
103
+ segments:
104
+ - 0
105
+ - 5
106
+ - 2
76
107
  version: 0.5.2
77
- type: :development
108
+ version_requirements: *id006
109
+ name: guard-rspec
78
110
  prerelease: false
79
- version_requirements: *2163244740
80
- - !ruby/object:Gem::Dependency
81
- name: guard-shell
82
- requirement: &2163244140 !ruby/object:Gem::Requirement
111
+ type: :development
112
+ - !ruby/object:Gem::Dependency
113
+ requirement: &id007 !ruby/object:Gem::Requirement
83
114
  none: false
84
- requirements:
115
+ requirements:
85
116
  - - ~>
86
- - !ruby/object:Gem::Version
117
+ - !ruby/object:Gem::Version
118
+ hash: 25
119
+ segments:
120
+ - 0
121
+ - 1
122
+ - 1
87
123
  version: 0.1.1
88
- type: :development
124
+ version_requirements: *id007
125
+ name: guard-shell
89
126
  prerelease: false
90
- version_requirements: *2163244140
91
- - !ruby/object:Gem::Dependency
92
- name: rb-fsevent
93
- requirement: &2163243540 !ruby/object:Gem::Requirement
127
+ type: :development
128
+ - !ruby/object:Gem::Dependency
129
+ requirement: &id008 !ruby/object:Gem::Requirement
94
130
  none: false
95
- requirements:
131
+ requirements:
96
132
  - - ~>
97
- - !ruby/object:Gem::Version
133
+ - !ruby/object:Gem::Version
134
+ hash: 97
135
+ segments:
136
+ - 0
137
+ - 4
138
+ - 3
139
+ - 1
98
140
  version: 0.4.3.1
99
- type: :development
141
+ version_requirements: *id008
142
+ name: rb-fsevent
100
143
  prerelease: false
101
- version_requirements: *2163243540
102
- - !ruby/object:Gem::Dependency
103
- name: growl
104
- requirement: &2163242940 !ruby/object:Gem::Requirement
144
+ type: :development
145
+ - !ruby/object:Gem::Dependency
146
+ requirement: &id009 !ruby/object:Gem::Requirement
105
147
  none: false
106
- requirements:
148
+ requirements:
107
149
  - - ~>
108
- - !ruby/object:Gem::Version
150
+ - !ruby/object:Gem::Version
151
+ hash: 17
152
+ segments:
153
+ - 1
154
+ - 0
155
+ - 3
109
156
  version: 1.0.3
110
- type: :development
157
+ version_requirements: *id009
158
+ name: growl
111
159
  prerelease: false
112
- version_requirements: *2163242940
113
- - !ruby/object:Gem::Dependency
114
- name: awesome_print
115
- requirement: &2163242340 !ruby/object:Gem::Requirement
116
- none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
121
160
  type: :development
161
+ - !ruby/object:Gem::Dependency
162
+ requirement: &id010 !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ hash: 3
168
+ segments:
169
+ - 0
170
+ version: "0"
171
+ version_requirements: *id010
172
+ name: awesome_print
122
173
  prerelease: false
123
- version_requirements: *2163242340
124
- description: ''
174
+ type: :development
175
+ description: ""
125
176
  email: gcao99@gmail.com
126
177
  executables: []
178
+
127
179
  extensions: []
128
- extra_rdoc_files:
180
+
181
+ extra_rdoc_files:
129
182
  - LICENSE.txt
130
183
  - README.rdoc
131
- files:
184
+ files:
132
185
  - .document
133
186
  - .irbrc
134
187
  - .rspec
@@ -160,8 +213,8 @@ files:
160
213
  - lib/aspector/method_matcher.rb
161
214
  - lib/aspector/module_extension.rb
162
215
  - lib/aspector/object_extension.rb
163
- - lib/aspector/return_this.rb
164
216
  - performance-tests/after_test.rb
217
+ - performance-tests/around_advice_benchmark.rb
165
218
  - performance-tests/around_test.rb
166
219
  - performance-tests/before_test.rb
167
220
  - performance-tests/combined_test.rb
@@ -183,31 +236,37 @@ files:
183
236
  - spec/unit/deferred_logic_spec.rb
184
237
  - spec/unit/method_matcher_spec.rb
185
238
  homepage: http://github.com/gcao/aspector
186
- licenses:
239
+ licenses:
187
240
  - MIT
188
241
  post_install_message:
189
242
  rdoc_options: []
190
- require_paths:
243
+
244
+ require_paths:
191
245
  - lib
192
- required_ruby_version: !ruby/object:Gem::Requirement
246
+ required_ruby_version: !ruby/object:Gem::Requirement
193
247
  none: false
194
- requirements:
195
- - - ! '>='
196
- - !ruby/object:Gem::Version
197
- version: '0'
198
- segments:
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ hash: 3
252
+ segments:
199
253
  - 0
200
- hash: 1194113144013302590
201
- required_rubygems_version: !ruby/object:Gem::Requirement
254
+ version: "0"
255
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
256
  none: false
203
- requirements:
204
- - - ! '>='
205
- - !ruby/object:Gem::Version
206
- version: '0'
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ hash: 3
261
+ segments:
262
+ - 0
263
+ version: "0"
207
264
  requirements: []
265
+
208
266
  rubyforge_project:
209
267
  rubygems_version: 1.8.15
210
268
  signing_key:
211
269
  specification_version: 3
212
270
  summary: Aspect Oriented Ruby Programming
213
271
  test_files: []
272
+
@@ -1,9 +0,0 @@
1
- module Aspector
2
- class ReturnThis
3
- attr :value
4
-
5
- def initialize value
6
- @value = value
7
- end
8
- end
9
- end