aspect4r 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "aspect4r"
8
8
  gem.summary = %Q{Aspect Oriented Programming for ruby}
9
- gem.description = %Q{AOP for ruby - use before_method, after_method and around_method to trim your fat methods and reduce code duplication}
9
+ gem.description = %Q{AOP for ruby - use before, after and around to trim your fat methods and reduce code duplication}
10
10
  gem.email = "gcao99@gmail.com"
11
11
  gem.homepage = "http://github.com/gcao/aspect4r"
12
12
  gem.authors = ["Guoliang Cao"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.1
1
+ 0.8.0
data/aspect4r.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{aspect4r}
8
- s.version = "0.7.1"
8
+ s.version = "0.8.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 = %q{2010-06-08}
13
- s.description = %q{AOP for ruby - use before_method, after_method and around_method to trim your fat methods and reduce code duplication}
12
+ s.date = %q{2010-06-10}
13
+ s.description = %q{AOP for ruby - use before, after and around to trim your fat methods and reduce code duplication}
14
14
  s.email = %q{gcao99@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
@@ -44,6 +44,11 @@ Gem::Specification.new do |s|
44
44
  "lib/aspect4r/model/advices_for_method.rb",
45
45
  "lib/aspect4r/model/aspect_data.rb",
46
46
  "lib/aspect4r/return_this.rb",
47
+ "spec/aspect4r/advice_group_spec.rb",
48
+ "spec/aspect4r/advice_on_class_method_spec.rb",
49
+ "spec/aspect4r/advice_spec.rb",
50
+ "spec/aspect4r/advice_test_spec.rb",
51
+ "spec/aspect4r/advices_for_method_spec.rb",
47
52
  "spec/aspect4r/after_spec.rb",
48
53
  "spec/aspect4r/around_spec.rb",
49
54
  "spec/aspect4r/before_spec.rb",
@@ -69,7 +74,12 @@ Gem::Specification.new do |s|
69
74
  s.rubygems_version = %q{1.3.7}
70
75
  s.summary = %q{Aspect Oriented Programming for ruby}
71
76
  s.test_files = [
72
- "spec/aspect4r/after_spec.rb",
77
+ "spec/aspect4r/advice_group_spec.rb",
78
+ "spec/aspect4r/advice_on_class_method_spec.rb",
79
+ "spec/aspect4r/advice_spec.rb",
80
+ "spec/aspect4r/advice_test_spec.rb",
81
+ "spec/aspect4r/advices_for_method_spec.rb",
82
+ "spec/aspect4r/after_spec.rb",
73
83
  "spec/aspect4r/around_spec.rb",
74
84
  "spec/aspect4r/before_spec.rb",
75
85
  "spec/aspect4r/class_inheritance_spec.rb",
data/lib/aspect4r/base.rb CHANGED
@@ -25,7 +25,16 @@ module Aspect4r
25
25
 
26
26
  module ClassMethods
27
27
  def a4r_data
28
- @a4r_data ||= Aspect4r::Model::AspectData.new
28
+ @a4r_data ||= Aspect4r::Model::AspectData.new(self)
29
+ end
30
+
31
+ def a4r_group
32
+ a4r_data.change_group
33
+
34
+ if block_given?
35
+ yield
36
+ a4r_data.change_group
37
+ end
29
38
  end
30
39
  end
31
40
  end
@@ -4,12 +4,7 @@ class Class
4
4
 
5
5
  return if @a4r_data.nil? or @a4r_data.empty?
6
6
 
7
- a4r_data = Aspect4r::Model::AspectData.new
8
-
9
- # @a4r_data.each do |key, value|
10
- # a4r_data[key] = (value.clone rescue value)
11
- # end
12
-
7
+ a4r_data = Aspect4r::Model::AspectData.new(child)
13
8
  a4r_data.methods_with_advices.merge(@a4r_data.methods_with_advices)
14
9
 
15
10
  child.instance_variable_set('@a4r_data', a4r_data)
@@ -1,6 +1,6 @@
1
1
  class Module
2
2
  def included_with_a4r(base)
3
- included_without_a4r(child) if respond_to?(:included_without_a4r)
3
+ included_without_a4r(base)
4
4
 
5
5
  return if @a4r_data.nil? or @a4r_data.empty?
6
6
 
@@ -14,12 +14,12 @@ class Module
14
14
  alias included included_with_a4r
15
15
 
16
16
  def method_added_with_a4r(method)
17
- method_added_without_a4r(child) if respond_to?(:method_added_without_a4r)
17
+ method_added_without_a4r(method)
18
18
 
19
19
  return if method.to_s =~ /a4r/
20
20
 
21
21
  # save unbound method and create new method
22
- if not Aspect4r::Helper.creating_method? and @a4r_data and method_advices = @a4r_data[method]
22
+ if @a4r_data and method_advices = @a4r_data[method] and not Aspect4r::Helper.creating_method?
23
23
  method_advices.wrapped_method = instance_method(method)
24
24
  Aspect4r::Helper.create_method self, method
25
25
  end
@@ -27,4 +27,22 @@ class Module
27
27
 
28
28
  alias method_added_without_a4r method_added
29
29
  alias method_added method_added_with_a4r
30
+
31
+ def singleton_method_added_with_a4r(method)
32
+ singleton_method_added_without_a4r(method)
33
+
34
+ return if method.to_s =~ /a4r/
35
+
36
+ # save unbound method and create new method
37
+ eigen_class = Aspect4r::Helper.eigen_class(self)
38
+ my_advices = eigen_class.instance_variable_get(:@a4r_data)
39
+
40
+ if my_advices and method_advices = my_advices[method] and not Aspect4r::Helper.creating_method?
41
+ method_advices.wrapped_method = eigen_class.instance_method(method)
42
+ Aspect4r::Helper.create_method eigen_class, method
43
+ end
44
+ end
45
+
46
+ alias singleton_method_added_without_a4r singleton_method_added
47
+ alias singleton_method_added singleton_method_added_with_a4r
30
48
  end
@@ -13,10 +13,18 @@ module Aspect4r
13
13
  @creating_method
14
14
  end
15
15
 
16
+ def self.eigen_class klass_or_module
17
+ klass_or_module.module_eval do
18
+ class << self
19
+ self
20
+ end
21
+ end
22
+ end
23
+
16
24
  # Store original method in aspect data and refer to it whenever recreating method
17
25
  def self.process_advice meta_data, klass_or_module, *methods, &block
18
26
  methods.flatten!
19
-
27
+
20
28
  options = meta_data.default_options.clone
21
29
  options.merge!(methods.pop) if methods.last.is_a? Hash
22
30
  options.merge!(meta_data.mandatory_options)
@@ -33,8 +41,9 @@ module Aspect4r
33
41
  method = method.to_sym
34
42
  klass_or_module.a4r_data.methods_with_advices << method
35
43
 
36
- aspect = klass_or_module.a4r_data[method] ||= Aspect4r::Model::AdvicesForMethod.new(method)
37
- aspect.add Aspect4r::Model::Advice.new(meta_data.advice_type, with_method, options)
44
+ a4r_data = klass_or_module.a4r_data
45
+ aspect = a4r_data[method] ||= Aspect4r::Model::AdvicesForMethod.new(method)
46
+ aspect.add Aspect4r::Model::Advice.new(meta_data.advice_type, with_method, a4r_data.group, options)
38
47
 
39
48
  if not aspect.wrapped_method and klass_or_module.instance_methods.include?(method.to_s)
40
49
  aspect.wrapped_method = klass_or_module.instance_method(method)
@@ -57,16 +66,16 @@ module Aspect4r
57
66
  end
58
67
 
59
68
  grouped_advices = []
60
- inner_most = true
69
+ group = nil
70
+ inner_most = true
61
71
 
62
- aspect.advices.each do |advice|
63
- if advice.around? and not grouped_advices.empty?
72
+ aspect.each do |advice|
73
+ if ((group and group != advice.group) or advice.around?) and not grouped_advices.empty?
64
74
  # wrap up advices before current advice
65
75
  create_method_for_before_after_advices klass, method, grouped_advices, inner_most
66
76
 
67
- inner_most = false
68
-
69
77
  grouped_advices = []
78
+ inner_most = false
70
79
  end
71
80
 
72
81
  # handle current advice
@@ -76,6 +85,8 @@ module Aspect4r
76
85
  else
77
86
  grouped_advices << advice
78
87
  end
88
+
89
+ group = advice.group
79
90
  end
80
91
 
81
92
  # create wrap method for before/after advices which are not wrapped inside around advice.
@@ -160,7 +171,7 @@ module Aspect4r
160
171
  CODE
161
172
 
162
173
  def self.create_method_for_before_after_advices klass, method, advices, inner_most
163
- before_advices = advices.select {|advice| advice.before? }
174
+ before_advices = advices.select {|advice| advice.before? or advice.before_filter? }
164
175
  after_advices = advices.select {|advice| advice.after? }
165
176
 
166
177
  code = METHOD_TEMPLATE.result(binding)
@@ -5,24 +5,38 @@ module Aspect4r
5
5
  AFTER = 2
6
6
  AROUND = 3
7
7
 
8
+ attr :group
8
9
  attr_accessor :type, :with_method, :options
9
10
 
10
- def initialize type, with_method, options = {}
11
+ def initialize type, with_method, group, options = {}
11
12
  @type = type
12
13
  @with_method = with_method
14
+ @group = group
13
15
  @options = options
14
16
  end
15
17
 
16
18
  def name
17
19
  options[:name] || with_method
18
20
  end
19
-
20
- %w(before after around).each do |aspect|
21
- class_eval <<-CODE
22
- def #{aspect}?
23
- type == #{aspect.upcase}
24
- end
25
- CODE
21
+
22
+ def before?
23
+ type == BEFORE and not options[:skip_if_false]
24
+ end
25
+
26
+ def before_filter?
27
+ type == BEFORE and options[:skip_if_false]
28
+ end
29
+
30
+ def after?
31
+ type == AFTER
32
+ end
33
+
34
+ def around?
35
+ type == AROUND
36
+ end
37
+
38
+ def invoke obj, *args
39
+ obj.send with_method, *args
26
40
  end
27
41
  end
28
42
  end
@@ -1,6 +1,6 @@
1
1
  module Aspect4r
2
2
  module Model
3
- class AdvicesForMethod
3
+ class AdvicesForMethod < Array
4
4
  attr_reader :method
5
5
  attr_accessor :wrapped_method
6
6
 
@@ -8,37 +8,18 @@ module Aspect4r
8
8
  @method = method
9
9
  end
10
10
 
11
- def advices
12
- @advices ||= []
13
- end
14
-
15
11
  def add new_advice
16
- advices << new_advice unless include?(new_advice)
17
- end
18
-
19
- def empty?
20
- @advices.nil? or @advices.empty?
12
+ self << new_advice unless include?(new_advice)
21
13
  end
22
-
23
- def include? new_advice
24
- advices.detect { |advice| advice.name == new_advice.name }
25
- end
26
-
27
- def merge! another
28
- unless another.nil? or another.empty?
29
- another.advices.each do |advice|
30
- advices.push advice unless include?(advice)
31
- end
32
- end
33
14
 
34
- self
15
+ def include? new_advice
16
+ detect { |advice| advice.name == new_advice.name }
35
17
  end
36
-
37
- def clone
38
- o = self.class.new(method)
39
- o.advices.push *advices unless empty?
40
-
41
- o
18
+
19
+ def [] index
20
+ return super unless index.is_a? String or index.is_a? Symbol
21
+
22
+ detect {|advice| advice.name.to_sym == index.to_sym }
42
23
  end
43
24
  end
44
25
  end
@@ -3,12 +3,20 @@ require 'set'
3
3
  module Aspect4r
4
4
  module Model
5
5
  class AspectData < Hash
6
- def initialize *args
7
- super
6
+ def initialize klass_or_module
7
+ @klass_or_module = klass_or_module
8
8
  end
9
-
10
- def advices
11
- @advices ||= {}
9
+
10
+ def group_index
11
+ @group_index ||= 0
12
+ end
13
+
14
+ def group
15
+ "#{@klass_or_module.hash}:#{group_index}"
16
+ end
17
+
18
+ def change_group
19
+ @group_index = group_index + 1
12
20
  end
13
21
 
14
22
  def methods_with_advices
data/lib/aspect4r.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'aspect4r/before'
2
2
  require 'aspect4r/after'
3
3
  require 'aspect4r/around'
4
+ require 'aspect4r/classic'
4
5
 
5
6
  module Aspect4r
6
7
  def self.included(base)
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Group of advices" do
4
+ it "should work" do
5
+ klass = Class.new do
6
+ include Aspect4r
7
+
8
+ attr :value
9
+
10
+ def initialize
11
+ @value = []
12
+ end
13
+
14
+ def test
15
+ @value << "test"
16
+ end
17
+
18
+ a4r_group do
19
+ before :test do
20
+ @value << "before(group1)"
21
+ end
22
+ end
23
+
24
+ a4r_group do
25
+ before :test do
26
+ @value << "before(group2)"
27
+ end
28
+ end
29
+ end
30
+
31
+ o = klass.new
32
+ o.test
33
+
34
+ o.value.should == %w(before(group2) before(group1) test)
35
+ end
36
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Advices on singleton method (also known as class method)" do
4
+ it "class method" do
5
+ class AdvicesOnClassMethod
6
+ class << self
7
+ include Aspect4r
8
+
9
+ def value
10
+ @value ||= []
11
+ end
12
+
13
+ around :test do |proxy|
14
+ value << "around(before)"
15
+ a4r_invoke proxy
16
+ value << "around(after)"
17
+ end
18
+
19
+ before :test do
20
+ value << "before"
21
+ end
22
+
23
+ after :test do
24
+ value << "after"
25
+ end
26
+
27
+ def test
28
+ value << "test"
29
+ end
30
+ end
31
+ end
32
+
33
+ AdvicesOnClassMethod.test
34
+ AdvicesOnClassMethod.value.should == %w(before around(before) test around(after) after)
35
+ end
36
+
37
+ it "module singleton method" do
38
+ module AdvicesOnModuleSingletonMethod
39
+ class << self
40
+ include Aspect4r
41
+
42
+ def value
43
+ @value ||= []
44
+ end
45
+
46
+ around :test do |proxy|
47
+ value << "around(before)"
48
+ a4r_invoke proxy
49
+ value << "around(after)"
50
+ end
51
+
52
+ before :test do
53
+ value << "before"
54
+ end
55
+
56
+ after :test do
57
+ value << "after"
58
+ end
59
+
60
+ def test
61
+ value << "test"
62
+ end
63
+ end
64
+ end
65
+
66
+ AdvicesOnModuleSingletonMethod.test
67
+ AdvicesOnModuleSingletonMethod.value.should == %w(before around(before) test around(after) after)
68
+ end
69
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r::Model::Advice do
4
+ it "before? returns true for before advice" do
5
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group
6
+ advice.before?.should be_true
7
+ end
8
+
9
+ it "before_filter? returns false for before_filter advice" do
10
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group
11
+ advice.before_filter?.should be_false
12
+ end
13
+
14
+ it "before? returns false for before advice" do
15
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group, :skip_if_false => true
16
+ advice.before?.should be_false
17
+ end
18
+
19
+ it "before_filter? returns true for before_filter advice" do
20
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group, :skip_if_false => true
21
+ advice.before_filter?.should be_true
22
+ end
23
+
24
+ it "invoke before advice" do
25
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group
26
+
27
+ o = Object.new
28
+ o.class.send :define_method, :advice_method do |*args|
29
+ do_something *args
30
+ end
31
+
32
+ o.expects(:do_something).with(1)
33
+
34
+ advice.invoke(o, 1)
35
+ end
36
+
37
+ it "invoke after advice" do
38
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::AFTER, :advice_method, :group
39
+
40
+ o = Object.new
41
+ o.class.send :define_method, :advice_method do |result, *args|
42
+ do_something result, *args
43
+ end
44
+
45
+ o.expects(:do_something).with(1)
46
+
47
+ advice.invoke(o, 1)
48
+ end
49
+
50
+ it "invoke around advice" do
51
+ advice = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::AROUND, :advice_method, :group
52
+
53
+ o = Object.new
54
+ o.class.send :define_method, :advice_method do |proxy, *args|
55
+ a4r_invoke proxy, *args
56
+ end
57
+
58
+ o.expects(:a4r_invoke).with(:proxy, 1)
59
+
60
+ advice.invoke(o, :proxy, 1)
61
+ end
62
+ end
@@ -0,0 +1,102 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Test Advices" do
4
+ before do
5
+ @klass = Class.new do
6
+ include Aspect4r
7
+
8
+ attr :value
9
+
10
+ def initialize
11
+ @value = []
12
+ end
13
+
14
+ around :test do |proxy, input|
15
+ @value << "around(before)"
16
+ a4r_invoke proxy, input
17
+ @value << "around(after)"
18
+ end
19
+
20
+ before :test, :name => 'before_advice' do |input|
21
+ @value << 'before'
22
+ end
23
+
24
+ before_filter :test do |input|
25
+ @value << 'before_filter'
26
+ input >= 0
27
+ end
28
+
29
+ after :test do |result, input|
30
+ @value << "after"
31
+ result * 100
32
+ end
33
+
34
+ def test input
35
+ @value << "test"
36
+ end
37
+ end
38
+ end
39
+
40
+ it "number of advices" do
41
+ @klass.a4r_data[:test].size.should == 4
42
+ end
43
+
44
+ it "around advice" do
45
+ advice = @klass.a4r_data[:test][0]
46
+ advice.around?.should be_true
47
+
48
+ o = @klass.new
49
+ o.expects(:a4r_invoke).with(:proxy, 1)
50
+
51
+ advice.invoke(o, :proxy, 1)
52
+
53
+ o.value.should == %w(around(before) around(after))
54
+ end
55
+
56
+ it "before advice" do
57
+ advice = @klass.a4r_data[:test][1]
58
+ advice.before?.should be_true
59
+
60
+ o = @klass.new
61
+ advice.invoke(o, 1)
62
+
63
+ o.value.should == %w(before)
64
+ end
65
+
66
+ it "before advice retrieved by name" do
67
+ advice = @klass.a4r_data[:test][:before_advice]
68
+ advice.before?.should be_true
69
+
70
+ o = @klass.new
71
+ advice.invoke(o, 1)
72
+
73
+ o.value.should == %w(before)
74
+ end
75
+
76
+ it "before_filter advice returns true if input is not negative" do
77
+ advice = @klass.a4r_data[:test][2]
78
+ advice.before_filter?.should be_true
79
+
80
+ o = @klass.new
81
+ advice.invoke(o, 1).should be_true
82
+
83
+ o.value.should == %w(before_filter)
84
+ end
85
+
86
+ it "before_filter advice returns false if input is negative" do
87
+ advice = @klass.a4r_data[:test][2]
88
+
89
+ o = @klass.new
90
+ advice.invoke(o, -1).should be_false
91
+ end
92
+
93
+ it "after advice" do
94
+ advice = @klass.a4r_data[:test][3]
95
+ advice.after?.should be_true
96
+
97
+ o = @klass.new
98
+ advice.invoke(o, 1, 1).should == 100
99
+
100
+ o.value.should == %w(after)
101
+ end
102
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r::Model::AdvicesForMethod do
4
+ it "should be able to get advice by name" do
5
+ advices = Aspect4r::Model::AdvicesForMethod.new(:test)
6
+ advice1 = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group, :name => :advice1
7
+ advices.add advice1
8
+ advices[:advice1].should == advice1
9
+ end
10
+
11
+ it "should be able to get advice by name String" do
12
+ advices = Aspect4r::Model::AdvicesForMethod.new(:test)
13
+ advice1 = Aspect4r::Model::Advice.new Aspect4r::Model::Advice::BEFORE, :advice_method, :group, :name => :advice1
14
+ advices.add advice1
15
+ advices['advice1'].should == advice1
16
+ end
17
+ end
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- require 'aspect4r/classic'
3
+ require 'aspect4r'
4
4
 
5
5
  describe Aspect4r::Classic do
6
6
  it "should work" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aspect4r
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 63
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 7
9
- - 1
10
- version: 0.7.1
8
+ - 8
9
+ - 0
10
+ version: 0.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Guoliang Cao
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-08 00:00:00 -04:00
18
+ date: 2010-06-10 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: 1.2.9
35
35
  type: :development
36
36
  version_requirements: *id001
37
- description: AOP for ruby - use before_method, after_method and around_method to trim your fat methods and reduce code duplication
37
+ description: AOP for ruby - use before, after and around to trim your fat methods and reduce code duplication
38
38
  email: gcao99@gmail.com
39
39
  executables: []
40
40
 
@@ -71,6 +71,11 @@ files:
71
71
  - lib/aspect4r/model/advices_for_method.rb
72
72
  - lib/aspect4r/model/aspect_data.rb
73
73
  - lib/aspect4r/return_this.rb
74
+ - spec/aspect4r/advice_group_spec.rb
75
+ - spec/aspect4r/advice_on_class_method_spec.rb
76
+ - spec/aspect4r/advice_spec.rb
77
+ - spec/aspect4r/advice_test_spec.rb
78
+ - spec/aspect4r/advices_for_method_spec.rb
74
79
  - spec/aspect4r/after_spec.rb
75
80
  - spec/aspect4r/around_spec.rb
76
81
  - spec/aspect4r/before_spec.rb
@@ -124,6 +129,11 @@ signing_key:
124
129
  specification_version: 3
125
130
  summary: Aspect Oriented Programming for ruby
126
131
  test_files:
132
+ - spec/aspect4r/advice_group_spec.rb
133
+ - spec/aspect4r/advice_on_class_method_spec.rb
134
+ - spec/aspect4r/advice_spec.rb
135
+ - spec/aspect4r/advice_test_spec.rb
136
+ - spec/aspect4r/advices_for_method_spec.rb
127
137
  - spec/aspect4r/after_spec.rb
128
138
  - spec/aspect4r/around_spec.rb
129
139
  - spec/aspect4r/before_spec.rb