Skip to content

Commit e70495b

Browse files
committed
Implement .active_method
1 parent ba40b98 commit e70495b

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

lib/active_method.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,21 @@
44

55
module ActiveMethod
66
autoload :Base, "active_method/base"
7+
autoload :Util, "active_method/util"
8+
9+
def self.included(base)
10+
base.extend ClassMethods
11+
end
12+
13+
module ClassMethods
14+
def active_method(name, method_class = nil)
15+
method_class ||= Util.constantize self, Util.camel_case(name)
16+
17+
define_method name do |*args|
18+
method = method_class.new(*args)
19+
method.__set_owner(self)
20+
method.call
21+
end
22+
end
23+
end
724
end

lib/active_method/base.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ def initialize(*args)
9999
def call
100100
end
101101

102+
def __set_owner(owner)
103+
@__method_owner = owner
104+
105+
instance_name = Util.snake_case(owner.class.name.split("::").last)
106+
self.class.define_method instance_name do
107+
@__method_owner
108+
end
109+
end
110+
102111
private
103112

104113
def arguments

test/test_active_method.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,51 @@ def test_that_it_has_a_version_number
88
refute_nil ::ActiveMethod::VERSION
99
end
1010

11+
################
12+
# .active_method
13+
################
14+
15+
class Buzz < ActiveMethod::Base
16+
argument :a
17+
argument :b
18+
keyword_argument :c
19+
keyword_argument :d
20+
21+
def call
22+
[a, b, c, d, foo_bar.x, foo_bar.y, foo_bar.z]
23+
end
24+
end
25+
26+
class BAZ < ActiveMethod::Base
27+
argument :a
28+
argument :b
29+
keyword_argument :c
30+
keyword_argument :d
31+
32+
def call
33+
[a, b, c, d, foo_bar.x, foo_bar.y, foo_bar.z]
34+
end
35+
end
36+
37+
module Example
38+
class FooBar
39+
include ActiveMethod
40+
41+
active_method :buzz
42+
active_method :baz, BAZ
43+
44+
def x; 'x'; end
45+
def y; 'y'; end
46+
def z; 'z'; end
47+
end
48+
end
49+
50+
it ".active_method - infer method class base on name" do
51+
assert_equal ['a', 'b', 'c', 'd', 'x', 'y', 'z'], Example::FooBar.new.buzz('a', 'b', c: 'c', d: 'd')
52+
end
53+
54+
it ".active_method - direct set method class" do
55+
assert_equal ['a', 'b', 'c', 'd', 'x', 'y', 'z'], Example::FooBar.new.baz('a', 'b', c: 'c', d: 'd')
56+
end
57+
1158
end

0 commit comments

Comments
 (0)