maroon 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Test/Context_test.rb +42 -11
- data/Test/{production_test.rb → abstract_syntax_tree_test.rb} +8 -3
- data/base/{Production.rb → AbstractSyntaxTree.rb} +15 -5
- data/base/AstRewritter.rb +48 -37
- data/base/maroon_base.rb +52 -165
- data/base/transfomer.rb +197 -0
- data/generated/build.rb +2 -2
- data/generated/interpretation_context.rb +7 -1
- data/lib/AstRewritter.rb +41 -31
- data/lib/Context.rb +44 -116
- data/lib/ImmutableQueue.rb +0 -1
- data/lib/ImmutableStack.rb +2 -1
- data/lib/Production.rb +20 -6
- data/lib/Transformer.rb +174 -0
- data/lib/build.rb +3 -3
- data/lib/interpretation_context.rb +7 -1
- data/lib/maroon/version.rb +1 -1
- metadata +6 -7
- data/Test/MethodInfo_test.rb +0 -86
- data/base/method_info.rb +0 -67
- data/lib/MethodInfo.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8869041ee066afcbfc382e5679bdacbfef33401d
|
4
|
+
data.tar.gz: 30910b3f6b2a216c99bc8b204d52fe6b735a7c01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91a7a468e03ddb94d1549f138d52df08cf819bd85d4942064d867e0bcf6540911fc2882d33b3a33f92188479af5404deed83d730785db4466e52ac87cba895f4
|
7
|
+
data.tar.gz: ad2cc204002f1f19c07cfb8f596648bb78dd2541d4de4c27565e48e355a1aa476d0a3c16fcffe26647921a31356a546552d6967e308a723a39bc6984017c109a
|
data/Test/Context_test.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require_relative 'test_helper'
|
3
|
+
|
3
4
|
class MaroonInternal
|
4
5
|
|
5
6
|
end
|
7
|
+
#Context::generate_files_in('.')
|
6
8
|
class ContextTest < Test::Unit::TestCase
|
7
9
|
|
8
10
|
def test_role_method_call
|
9
11
|
name = :MyContextRoleMethodCall
|
10
12
|
role_name = :rol
|
11
|
-
|
13
|
+
|
14
|
+
c=Context::define name do
|
12
15
|
role role_name do
|
13
16
|
def rolem(x, y)
|
14
17
|
x+y
|
@@ -23,7 +26,7 @@ class ContextTest < Test::Unit::TestCase
|
|
23
26
|
assert_equal(7, MyContextRoleMethodCall.new.add(3, 4))
|
24
27
|
end
|
25
28
|
|
26
|
-
def
|
29
|
+
def xtest_simple
|
27
30
|
name = :MyContextSimple
|
28
31
|
role_name = :r
|
29
32
|
Context::define name do
|
@@ -31,13 +34,34 @@ class ContextTest < Test::Unit::TestCase
|
|
31
34
|
end
|
32
35
|
end
|
33
36
|
assert(Kernel::const_defined? name)
|
37
|
+
end
|
34
38
|
|
39
|
+
def xtest_bind
|
40
|
+
name = :MyContextBind
|
41
|
+
|
42
|
+
c= Context::define name do
|
43
|
+
role :role_name do
|
44
|
+
def sum
|
45
|
+
@sum += role_name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
def inter
|
49
|
+
@sum = 0
|
50
|
+
[1,2].each {|p|
|
51
|
+
bind :p=>:role_name
|
52
|
+
role_name.sum()
|
53
|
+
}
|
54
|
+
@sum
|
55
|
+
end
|
56
|
+
end
|
57
|
+
assert(Kernel::const_defined? name)
|
58
|
+
assert_equal(3, MyContextBind.new.inter)
|
35
59
|
end
|
36
60
|
|
37
|
-
def
|
61
|
+
def xtest_role_method
|
38
62
|
name = :MyContext
|
39
63
|
role_name = :rol
|
40
|
-
|
64
|
+
Context::define name do
|
41
65
|
role role_name do
|
42
66
|
def rolem
|
43
67
|
0+1
|
@@ -47,7 +71,7 @@ class ContextTest < Test::Unit::TestCase
|
|
47
71
|
assert_equal(1, MyContext.new.send(:self_rol_rolem))
|
48
72
|
end
|
49
73
|
|
50
|
-
def
|
74
|
+
def xtest_role_method_args
|
51
75
|
name = :MyContextArgs
|
52
76
|
role_name = :rol
|
53
77
|
Context::define name do
|
@@ -60,7 +84,7 @@ class ContextTest < Test::Unit::TestCase
|
|
60
84
|
assert_equal(7, MyContextArgs.new.send(:self_rol_rolem, 3, 4))
|
61
85
|
end
|
62
86
|
|
63
|
-
def
|
87
|
+
def xtest_role_method_splat
|
64
88
|
name = :MyContextSplat
|
65
89
|
role_name = :rol
|
66
90
|
Context::define name do
|
@@ -73,24 +97,31 @@ class ContextTest < Test::Unit::TestCase
|
|
73
97
|
assert_equal(7, MyContextSplat.new.send(:self_rol_rolem, 3, 4))
|
74
98
|
end
|
75
99
|
|
76
|
-
def
|
100
|
+
def xtest_role_method_block
|
77
101
|
name = :MyContextBlock
|
78
102
|
role_name = :rol
|
79
|
-
Context::define name do
|
103
|
+
c= Context::define name do
|
104
|
+
role :num do
|
105
|
+
def next
|
106
|
+
num + 3
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
80
110
|
role role_name do
|
81
111
|
def rolem(*args, &b)
|
82
112
|
res = 0
|
83
113
|
args.each { |x|
|
84
|
-
|
114
|
+
bind :x=>:num
|
115
|
+
res = b.call res, num.next
|
85
116
|
}
|
86
117
|
res
|
87
118
|
end
|
88
119
|
end
|
89
120
|
end
|
90
|
-
assert_equal(
|
121
|
+
assert_equal(9, MyContextBlock.new.send(:self_rol_rolem, 3, 4) { |x, res| res + x })
|
91
122
|
end
|
92
123
|
|
93
|
-
def
|
124
|
+
def xtest_class_method_block
|
94
125
|
name = :MyContextClass
|
95
126
|
role_name = :rol
|
96
127
|
Context::define name do
|
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require_relative '../generated/Tokens'
|
3
|
-
require_relative '../generated/
|
3
|
+
require_relative '../generated/AbstractSyntaxTree'
|
4
4
|
require_relative 'test_helper'
|
5
|
-
|
5
|
+
|
6
|
+
class AbstractSyntaxTreeTest < Test::Unit::TestCase
|
6
7
|
def get_method_call &b
|
7
8
|
exp = get_sexp &b
|
8
9
|
exp[3]
|
9
10
|
end
|
10
11
|
|
12
|
+
def get_context(roles={},contracts={},role_aliases={},defining=nil,private_interactions= {})
|
13
|
+
InterpretationContext.new(roles, contracts, role_aliases,defining,private_interactions)
|
14
|
+
end
|
15
|
+
|
11
16
|
def test_rolemethod
|
12
17
|
method_call = get_method_call { foo.bar }
|
13
18
|
|
@@ -19,7 +24,7 @@ class ProductionTest < Test::Unit::TestCase
|
|
19
24
|
def get_production(method_call)
|
20
25
|
contracts ={}
|
21
26
|
roles = {:foo => {:bar => []}}
|
22
|
-
|
27
|
+
AbstractSyntaxTree.new(method_call, get_context(roles, contracts))
|
23
28
|
end
|
24
29
|
|
25
30
|
def test_call
|
@@ -1,4 +1,4 @@
|
|
1
|
-
context :
|
1
|
+
context :AbstractSyntaxTree do
|
2
2
|
role :interpretation_context do
|
3
3
|
end
|
4
4
|
role :queue do
|
@@ -36,9 +36,19 @@ context :Production do
|
|
36
36
|
def is_block_with_bind?
|
37
37
|
if production.is_block?
|
38
38
|
body = @production.last()
|
39
|
-
if body && (exp = body[
|
40
|
-
bind =
|
39
|
+
if body && (exp = body[1])
|
40
|
+
bind = AbstractSyntaxTree.new exp, @interpretation_context
|
41
41
|
if bind.type == Tokens::call && bind.data == :bind
|
42
|
+
aliases = {}
|
43
|
+
list = exp.last[1..-1]
|
44
|
+
(list.length/2).times{|i|
|
45
|
+
local = list[i*2].last
|
46
|
+
role_name = list[i*2+1].last
|
47
|
+
raise 'Local in bind should be a symbol' unless local.instance_of? Symbol
|
48
|
+
raise 'Role name in bind should be a symbol' unless role_name.instance_of? Symbol
|
49
|
+
aliases[local] = role_name
|
50
|
+
}
|
51
|
+
@data = aliases
|
42
52
|
true
|
43
53
|
end
|
44
54
|
end
|
@@ -48,7 +58,7 @@ context :Production do
|
|
48
58
|
def is_rolemethod_call?
|
49
59
|
can_be = production.is_call?
|
50
60
|
if can_be
|
51
|
-
instance =
|
61
|
+
instance = AbstractSyntaxTree.new(production[1], @interpretation_context)
|
52
62
|
can_be = instance.type == Tokens::role
|
53
63
|
if can_be
|
54
64
|
instance_data = instance.data
|
@@ -120,7 +130,7 @@ context :Production do
|
|
120
130
|
end
|
121
131
|
end
|
122
132
|
|
123
|
-
def
|
133
|
+
def each_production
|
124
134
|
yield self
|
125
135
|
if production.instance_of? Sexp || production.instance_of?(Array)
|
126
136
|
@queue = @queue.push_array production
|
data/base/AstRewritter.rb
CHANGED
@@ -3,11 +3,12 @@ context :AstRewritter do
|
|
3
3
|
end
|
4
4
|
|
5
5
|
def initialize (ast, interpretation_context)
|
6
|
-
@ast =
|
6
|
+
@ast = AbstractSyntaxTree.new ast, interpretation_context
|
7
|
+
@roles = interpretation_context.roles
|
7
8
|
end
|
8
9
|
|
9
10
|
def rewrite!
|
10
|
-
ast.
|
11
|
+
ast.each_production { |production|
|
11
12
|
|
12
13
|
case production.type
|
13
14
|
when Tokens::rolemethod_call
|
@@ -16,44 +17,54 @@ context :AstRewritter do
|
|
16
17
|
production[1] = nil
|
17
18
|
when Tokens::block_with_bind
|
18
19
|
block = production.last
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
block.delete_at 1
|
21
|
+
production.data.each do |local,aliased_role|
|
22
|
+
must_b_sym = 'aliased_role must be a Symbol'.to_sym
|
23
|
+
local_must_b_sym = 'local must be a Symbol'.to_sym
|
24
|
+
raise must_b_sym unless aliased_role.instance_of? Symbol
|
25
|
+
raise local_must_b_sym unless local.instance_of? Symbol
|
26
|
+
unless @roles.has_key? aliased_role
|
27
|
+
role_names = []
|
28
|
+
@interpretation_context.each do |k,v|
|
29
|
+
role_names << k.to_s
|
30
|
+
end
|
31
|
+
raise aliased_role.to_s + ' is not a role. Available roles are ' + role_names.join(',')
|
32
|
+
end
|
33
|
+
# assigning role player to role field
|
34
|
+
#notice that this will be executed after the next block
|
35
|
+
aliased_field = ('@' + aliased_role.to_s).to_sym
|
36
|
+
temp_symbol = ('temp____' + aliased_role.to_s).to_sym
|
27
37
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
38
|
+
assignment = Sexp.new
|
39
|
+
assignment[0] = :iasgn
|
40
|
+
assignment[1] = aliased_field
|
41
|
+
load_arg = Sexp.new
|
42
|
+
load_arg[0] = :lvar
|
43
|
+
load_arg[1] = local
|
44
|
+
assignment[2] = load_arg
|
45
|
+
block.insert 1, assignment
|
36
46
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
# assign role player to temp
|
48
|
+
# notice this is prepended Ie. inserted in front of the role player to role field
|
49
|
+
assignment = Sexp.new
|
50
|
+
assignment[0] = :lasgn
|
51
|
+
assignment[1] = temp_symbol
|
52
|
+
load_field = Sexp.new
|
53
|
+
load_field[0] = :ivar
|
54
|
+
load_field[1] = aliased_field
|
55
|
+
assignment[2] = load_field
|
56
|
+
block.insert 1, assignment
|
47
57
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
# reassign original player
|
59
|
+
assignment = Sexp.new
|
60
|
+
assignment[0] = :iasgn
|
61
|
+
assignment[1] = aliased_field
|
62
|
+
load_temp = Sexp.new
|
63
|
+
load_temp[0] = :lvar
|
64
|
+
load_temp[1] = temp_symbol
|
65
|
+
assignment[2] = load_temp
|
66
|
+
block[block.length] = assignment
|
67
|
+
end
|
57
68
|
else
|
58
69
|
#do nothing
|
59
70
|
end
|
data/base/maroon_base.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
1
|
##
|
4
2
|
# The Context class is used to define a DCI context with roles and their role methods
|
5
3
|
# to define a context call define with the name of the context (this name will become the name of the class that defines the context)
|
@@ -37,27 +35,40 @@
|
|
37
35
|
##
|
38
36
|
c = context :Context do
|
39
37
|
|
38
|
+
|
39
|
+
|
40
40
|
def self.define(*args, &block)
|
41
|
+
name, base_class, default_interaction = *args
|
42
|
+
if default_interaction and (not base_class.instance_of?(Class)) then
|
43
|
+
base_class = eval(base_class.to_s)
|
44
|
+
end
|
45
|
+
if base_class and ((not default_interaction) and (not base_class.instance_of?(Class))) then
|
46
|
+
base_class, default_interaction = default_interaction, base_class
|
47
|
+
end
|
41
48
|
@@with_contracts ||= nil
|
42
49
|
@@generate_file_path ||= nil
|
43
|
-
(
|
44
|
-
|
45
|
-
|
46
|
-
if (args.last.instance_of?(FalseClass) or args.last.instance_of?(TrueClass)) then
|
47
|
-
ctx.generate_files_in(args.last)
|
48
|
-
end
|
49
|
-
return ctx.send(:finalize, name, base_class, default_interaction, @@generate_file_path, @@with_contracts)
|
50
|
-
|
50
|
+
ctx = self.send(:create_context_factory, name, base_class, default_interaction, block)
|
51
|
+
transformer = Transformer.new name, ctx.roles,ctx.interactions,ctx.private_interactions,base_class, default_interaction
|
52
|
+
return transformer.transform @@generate_file_path, @@with_contracts
|
51
53
|
end
|
52
54
|
|
53
55
|
def self.generate_files_in(*args, &b)
|
54
|
-
|
55
|
-
return role_or_interaction_method(:generate_files_in, *args, &b)
|
56
|
-
end
|
56
|
+
|
57
57
|
@@generate_file_path = args[0]
|
58
58
|
|
59
59
|
end
|
60
60
|
|
61
|
+
def roles
|
62
|
+
@roles
|
63
|
+
end
|
64
|
+
def interactions
|
65
|
+
@interactions
|
66
|
+
end
|
67
|
+
def private_interactions
|
68
|
+
@private_interactions
|
69
|
+
end
|
70
|
+
|
71
|
+
|
61
72
|
private
|
62
73
|
|
63
74
|
def get_definitions(b)
|
@@ -77,15 +88,9 @@ c = context :Context do
|
|
77
88
|
end
|
78
89
|
end
|
79
90
|
|
80
|
-
def self.create_context_factory(
|
81
|
-
|
82
|
-
|
83
|
-
base_class = eval(base_class.to_s)
|
84
|
-
end
|
85
|
-
if base_class and ((not default_interaction) and (not base_class.instance_of?(Class))) then
|
86
|
-
base_class, default_interaction = default_interaction, base_class
|
87
|
-
end
|
88
|
-
ctx = Context.new
|
91
|
+
def self.create_context_factory(name, base_class, default_interaction, block)
|
92
|
+
|
93
|
+
ctx = Context.new name, base_class, default_interaction
|
89
94
|
ctx.instance_eval {
|
90
95
|
sexp = block.to_sexp
|
91
96
|
temp_block = sexp[3]
|
@@ -107,8 +112,7 @@ c = context :Context do
|
|
107
112
|
ctx.instance_eval &block
|
108
113
|
}
|
109
114
|
|
110
|
-
|
111
|
-
|
115
|
+
ctx
|
112
116
|
end
|
113
117
|
|
114
118
|
def self.with_contracts(*args)
|
@@ -121,183 +125,66 @@ c = context :Context do
|
|
121
125
|
|
122
126
|
end
|
123
127
|
|
124
|
-
def createInfo(definition)
|
125
|
-
MethodInfo.new(definition, @defining_role, @private)
|
126
|
-
end
|
127
|
-
|
128
128
|
def is_definition?(exp)
|
129
129
|
exp && (exp[0] == :defn || exp[0] == :defs)
|
130
130
|
end
|
131
131
|
|
132
132
|
def role(*args, &b)
|
133
133
|
role_name = args[0]
|
134
|
-
|
135
|
-
return role_or_interaction_method(:role, *args, &b)
|
136
|
-
end
|
134
|
+
|
137
135
|
@defining_role = role_name
|
138
136
|
@roles = {} unless @roles
|
139
137
|
@roles[role_name] = Hash.new
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
def current_interpretation_context(*args, &b)
|
150
|
-
if block_given? then
|
151
|
-
return role_or_interaction_method(:current_interpretation_context, *args, &b)
|
138
|
+
if block_given?
|
139
|
+
definitions = get_definitions(b)
|
140
|
+
definitions.each do |exp|
|
141
|
+
add_method(exp)
|
142
|
+
end
|
152
143
|
end
|
153
|
-
InterpretationContext.new(@roles, @contracts, @role_alias, nil)
|
154
144
|
|
155
145
|
end
|
156
146
|
|
157
147
|
def get_methods(*args, &b)
|
158
|
-
return role_or_interaction_method(:get_methods, *args, &b) if block_given?
|
159
148
|
name = args[0]
|
160
149
|
sources = (@defining_role ? (@roles[@defining_role]) : (@interactions))[name]
|
161
150
|
if @defining_role and (not sources) then
|
162
151
|
@roles[@defining_role][name] = []
|
163
152
|
else
|
153
|
+
@private_interactions[name] = true if @private
|
164
154
|
@interactions[name] = []
|
165
155
|
end
|
166
156
|
|
167
157
|
end
|
168
158
|
|
169
|
-
def add_method(
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
def finalize(*args, &b)
|
178
|
-
return role_or_interaction_method(:finalize, *args, &b) if block_given?
|
179
|
-
name, base_class, default, file_path, with_contracts = *args
|
180
|
-
code = generate_context_code(default, name)
|
181
|
-
if file_path then
|
182
|
-
name = name.to_s
|
183
|
-
complete = ((((('class ' + name) + (base_class ? (('<< ' + base_class.name)) : (''))) + '
|
184
|
-
') + code.to_s) + '
|
185
|
-
end')
|
186
|
-
File.open((((('./' + file_path.to_s) + '/') + name) + '.rb'), 'w') do |f|
|
187
|
-
f.write(complete)
|
188
|
-
end
|
189
|
-
complete
|
190
|
-
else
|
191
|
-
c = base_class ? (Class.new(base_class)) : (Class.new)
|
192
|
-
if with_contracts then
|
193
|
-
c.class_eval(
|
194
|
-
'def self.assert_that(obj)
|
195
|
-
ContextAsserter.new(self.contracts,obj)
|
196
|
-
end
|
197
|
-
def self.refute_that(obj)
|
198
|
-
ContextAsserter.new(self.contracts,obj,false)
|
199
|
-
end
|
200
|
-
def self.contracts
|
201
|
-
@@contracts
|
202
|
-
end
|
203
|
-
def self.contracts=(value)
|
204
|
-
@@contracts = value
|
205
|
-
end')
|
206
|
-
c.contracts = contracts
|
207
|
-
end
|
208
|
-
Kernel.const_set(name, c)
|
209
|
-
begin
|
210
|
-
temp = c.class_eval(code)
|
211
|
-
rescue SyntaxError
|
212
|
-
p 'error: ' + code
|
213
|
-
end
|
214
|
-
|
215
|
-
(temp or c)
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
|
220
|
-
def generate_context_code(*args, &b)
|
221
|
-
if block_given? then
|
222
|
-
return role_or_interaction_method(:generate_context_code, *args, &b)
|
223
|
-
end
|
224
|
-
default, name = args
|
225
|
-
getters = ''
|
226
|
-
impl = ''
|
227
|
-
interactions = ''
|
228
|
-
@interactions.each do |method_name, methods|
|
229
|
-
methods.each do |method|
|
230
|
-
@defining_role = nil
|
231
|
-
code = (' ' + method.build_as_context_method(current_interpretation_context))
|
232
|
-
method.is_private ? ((getters << code)) : ((interactions << code))
|
233
|
-
end
|
234
|
-
end
|
235
|
-
if default then
|
236
|
-
(interactions << (((((((('
|
237
|
-
def self.call(*args)
|
238
|
-
arity = ' + name.to_s) + '.method(:new).arity
|
239
|
-
newArgs = args[0..arity-1]
|
240
|
-
obj = ') + name.to_s) + '.new *newArgs
|
241
|
-
if arity < args.length
|
242
|
-
methodArgs = args[arity..-1]
|
243
|
-
obj.') + default.to_s) + ' *methodArgs
|
244
|
-
else
|
245
|
-
obj.') + default.to_s) + '
|
246
|
-
end
|
247
|
-
end
|
248
|
-
'))
|
249
|
-
(interactions << (('
|
250
|
-
def call(*args);' + default.to_s) + ' *args; end
|
251
|
-
'))
|
252
|
-
end
|
253
|
-
@roles.each do |role, methods|
|
254
|
-
(getters << (('attr_reader :' + role.to_s) + '
|
255
|
-
'))
|
256
|
-
methods.each do |method_name, method_sources|
|
257
|
-
unless (method_sources.length < 2) then
|
258
|
-
raise(('Duplicate definition of ' + method_name.to_s))
|
259
|
-
end
|
260
|
-
unless (method_sources.length > 0) then
|
261
|
-
raise(('No source for ' + method_name.to_s))
|
262
|
-
end
|
263
|
-
method_source = method_sources[0]
|
264
|
-
@defining_role = role
|
265
|
-
|
266
|
-
definition = method_source.build_as_context_method(current_interpretation_context)
|
267
|
-
(impl << (' ' + definition.to_s)) if definition
|
268
|
-
end
|
269
|
-
end
|
270
|
-
private_string = (getters + impl).strip! != '' ? '
|
271
|
-
private
|
272
|
-
' : ''
|
273
|
-
impl = impl.strip! != '' ? '
|
274
|
-
' + impl + '
|
275
|
-
' : '
|
276
|
-
'
|
277
|
-
interactions + private_string + getters + impl
|
278
|
-
|
279
|
-
end
|
280
|
-
|
281
|
-
def role_or_interaction_method(*arguments, &b)
|
282
|
-
method_name, on_self = *arguments
|
283
|
-
unless method_name.instance_of?(Symbol) then
|
284
|
-
on_self = method_name
|
285
|
-
method_name = :role_or_interaction_method
|
286
|
-
end
|
287
|
-
raise(('Method with out block ' + method_name.to_s)) unless block_given?
|
159
|
+
def add_method(definition)
|
160
|
+
name = if definition[1].instance_of? Symbol
|
161
|
+
definition[1]
|
162
|
+
else
|
163
|
+
(definition[1].select { |e| e.instance_of? Symbol }.map { |e| e.to_s }.join('.') + '.' + definition[2].to_s).to_sym
|
164
|
+
end
|
288
165
|
|
166
|
+
sources = get_methods(name)
|
167
|
+
(sources << definition)
|
289
168
|
end
|
290
169
|
|
291
170
|
def private
|
292
171
|
@private = true
|
293
172
|
end
|
294
173
|
|
295
|
-
def initialize
|
174
|
+
def initialize(name,base_class,default_interaction)
|
296
175
|
@roles = {}
|
297
176
|
@interactions = {}
|
177
|
+
@private_interactions = {}
|
298
178
|
@role_alias = {}
|
179
|
+
@name = name
|
180
|
+
@base_class = base_class
|
181
|
+
@default_interaction = default_interaction
|
299
182
|
end
|
300
183
|
|
184
|
+
role :name do end
|
185
|
+
role :base_class do end
|
186
|
+
role :default_interaction do end
|
187
|
+
|
301
188
|
end
|
302
189
|
|
303
190
|
if c.instance_of? String
|