maroon 0.7.1 → 0.8.0
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/README.md +26 -6
- data/Rakefile +3 -3
- data/Test/Context_test.rb +16 -16
- data/{Examples/Dijkstra → Test/Examples}/CalculateShortestDistance.rb +11 -13
- data/Test/Examples/MoneyTransfer_test.rb +76 -0
- data/{Examples/Dijkstra → Test/Examples}/calculate_shortest_path.rb +77 -89
- data/{Examples/Dijkstra → Test/Examples}/data.rb +0 -0
- data/{Examples/Dijkstra/dijkstra.rb → Test/Examples/dijkstra_test.rb} +34 -24
- data/Test/Examples/greeter_test.rb +48 -0
- data/{Examples/meter.rb → Test/Examples/meter_test.rb} +44 -30
- data/Test/abstract_syntax_tree_test.rb +17 -26
- data/Test/alltests.rb +1 -1
- data/Test/test_helper.rb +2 -0
- data/base/AbstractSyntaxTree.rb +24 -3
- data/base/ImmutableStack.rb +1 -1
- data/base/dependency_graph.rb +94 -0
- data/base/immutable_queue.rb +1 -1
- data/base/maroon_base.rb +50 -11
- data/base/transfomer.rb +196 -197
- data/generated/Tokens.rb +64 -2
- data/generated/build.rb +1 -3
- data/generated/maroon/kernel.rb +7 -0
- data/lib/AbstractSyntaxTree.rb +120 -0
- data/lib/AstRewritter.rb +53 -58
- data/lib/Context.rb +104 -126
- data/lib/DependencyGraph.rb +76 -0
- data/lib/ImmutableQueue.rb +28 -39
- data/lib/ImmutableStack.rb +20 -34
- data/lib/Tokens.rb +64 -2
- data/lib/Transformer.rb +125 -165
- data/lib/build.rb +2 -4
- data/lib/maroon/kernel.rb +1 -1
- data/lib/maroon/version.rb +1 -1
- metadata +13 -11
- data/Examples/MoneyTransfer.rb +0 -62
- data/Examples/greeter.rb +0 -46
- data/Test/Greeter_test_disabled.rb +0 -203
- data/lib/Production.rb +0 -149
data/generated/Tokens.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
class Tokens
|
2
2
|
def self.define_token(name)
|
3
|
-
class_eval
|
3
|
+
class_eval %{
|
4
|
+
@#{name} = Tokens.new :#{name};
|
5
|
+
def Tokens.#{name}
|
6
|
+
@#{name}
|
7
|
+
end
|
8
|
+
}
|
4
9
|
end
|
5
10
|
|
6
11
|
def to_s
|
@@ -21,4 +26,61 @@ class Tokens
|
|
21
26
|
define_token :indexer
|
22
27
|
define_token :block
|
23
28
|
define_token :block_with_bind
|
24
|
-
|
29
|
+
define_token :initializer
|
30
|
+
define_token :const
|
31
|
+
end
|
32
|
+
|
33
|
+
class DependencyGraphModel
|
34
|
+
|
35
|
+
def initialize(dependencies)
|
36
|
+
@dependencies = dependencies
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_hash
|
40
|
+
@dependecies
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
print_dependencies @dependencies,0
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_dot
|
48
|
+
res = ''
|
49
|
+
dependencies = denormalize @dependencies
|
50
|
+
dependencies.each{|d| res << d.reverse.join('->') << '
|
51
|
+
'}
|
52
|
+
'digraph g{
|
53
|
+
' + res + '}'
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def print_dependencies(dependencies,indent)
|
58
|
+
res = ''
|
59
|
+
dependencies.each do |key,value|
|
60
|
+
res << key.to_s
|
61
|
+
if value.instance_of? Hash
|
62
|
+
res << '->' << (print_dependencies value,indent != nil ? indent+4 : nil)
|
63
|
+
elsif
|
64
|
+
res << ':' << value.to_s + '
|
65
|
+
'
|
66
|
+
indent.times {res << ' '} unless indent == nil
|
67
|
+
end
|
68
|
+
res << '
|
69
|
+
'
|
70
|
+
end
|
71
|
+
res
|
72
|
+
end
|
73
|
+
|
74
|
+
def denormalize(dependencies)
|
75
|
+
res = []
|
76
|
+
dependencies.each do |key,value|
|
77
|
+
if value.instance_of? Hash
|
78
|
+
res = denormalize value
|
79
|
+
res.each{|a| a << key}
|
80
|
+
else
|
81
|
+
res << [key]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
res
|
85
|
+
end
|
86
|
+
end
|
data/generated/build.rb
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
class AbstractSyntaxTree
|
2
|
+
def initialize(ast,interpretation_context) rebind(ImmutableQueue.empty.push(ast), interpretation_context) end
|
3
|
+
def type() case
|
4
|
+
when (nil == production) then
|
5
|
+
nil
|
6
|
+
when self_production_is_block_with_bind? then
|
7
|
+
Tokens.block_with_bind
|
8
|
+
when self_production_is_block? then
|
9
|
+
Tokens.block
|
10
|
+
when (production.instance_of?(Fixnum) or production.instance_of?(Symbol)) then
|
11
|
+
Tokens.terminal
|
12
|
+
when self_production_is_rolemethod_call? then
|
13
|
+
Tokens.rolemethod_call
|
14
|
+
when self_production_is_role? then
|
15
|
+
Tokens.role
|
16
|
+
when self_production_is_indexer? then
|
17
|
+
Tokens.indexer
|
18
|
+
when self_production_is_const? then
|
19
|
+
Tokens.const
|
20
|
+
when self_production_is_initializer? then
|
21
|
+
Tokens.initializer
|
22
|
+
when self_production_is_call? then
|
23
|
+
Tokens.call
|
24
|
+
else
|
25
|
+
Tokens.other
|
26
|
+
end end
|
27
|
+
def [](i) @production[i] end
|
28
|
+
def []=(i,v) @production[i] = v end
|
29
|
+
def length() @production.length end
|
30
|
+
def last() @production.last end
|
31
|
+
def first() @production.first end
|
32
|
+
def data() return @data if @data
|
33
|
+
@data = case
|
34
|
+
when self_production_is_call? then
|
35
|
+
@production[2]
|
36
|
+
else
|
37
|
+
@production
|
38
|
+
end
|
39
|
+
end
|
40
|
+
def each_production() yield(self)
|
41
|
+
if production.instance_of?((Sexp or production.instance_of?(Array))) then
|
42
|
+
@queue = @queue.push_array(production)
|
43
|
+
end
|
44
|
+
while @queue.!=(ImmutableQueue.empty) do
|
45
|
+
rebind(@queue, @interpretation_context)
|
46
|
+
yield(self)
|
47
|
+
if production.instance_of?((Sexp or production.instance_of?(Array))) then
|
48
|
+
@queue = @queue.push_array(production)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
private
|
53
|
+
def rebind(queue,ctx) @data = nil
|
54
|
+
@production, @queue = queue.pop
|
55
|
+
@interpretation_context = ctx
|
56
|
+
end
|
57
|
+
def self_production_is_role?() case
|
58
|
+
when (self_production_is_call? and interpretation_context.roles.has_key?(production[2])) then
|
59
|
+
@data = [production[2]]
|
60
|
+
return true
|
61
|
+
when (((production == :self) or ((self_production_is_indexer? and ((production[1] == nil) or (production[1] == :self))) or (production and ((production.instance_of?(Sexp) or production.instance_of?(Array)) and (production[0] == :self))))) and @interpretation_context.defining_role) then
|
62
|
+
@data = @interpretation_context.defining_role
|
63
|
+
return true
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end end
|
67
|
+
def self_production_is_indexer?() self_production_is_call? and ((production[2] == :[]) or (production[2] == :[]=)) end
|
68
|
+
def self_production_is_call?() production and ((production.instance_of?(Sexp) or production.instance_of?(Array)) and (production[0] == :call)) end
|
69
|
+
def self_production_is_block?() production and ((production.instance_of?(Sexp) or production.instance_of?(Array)) and (production[0] == :iter)) end
|
70
|
+
def self_production_is_block_with_bind?() if self_production_is_block? then
|
71
|
+
body = @production.last
|
72
|
+
if body and exp = body[1] then
|
73
|
+
bind = AbstractSyntaxTree.new(exp, @interpretation_context)
|
74
|
+
if (bind.type == Tokens.call) and (bind.data == :bind) then
|
75
|
+
aliases = {}
|
76
|
+
list = exp.last[(1..-1)]
|
77
|
+
(list.length / 2).times do |i|
|
78
|
+
local = list[(i * 2)].last
|
79
|
+
role_name = list[((i * 2) + 1)].last
|
80
|
+
raise("Local in bind should be a symbol") unless local.instance_of?(Symbol)
|
81
|
+
unless role_name.instance_of?(Symbol) then
|
82
|
+
raise("Role name in bind should be a symbol")
|
83
|
+
end
|
84
|
+
aliases[local] = role_name
|
85
|
+
end
|
86
|
+
@data = aliases
|
87
|
+
true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end end
|
91
|
+
def self_production_is_const?() if production.instance_of?(Sexp) and ((production.length == 2) and ((production[0] == :const) and production[1].instance_of?(Symbol))) then
|
92
|
+
@data = [production[1]]
|
93
|
+
true
|
94
|
+
else
|
95
|
+
false
|
96
|
+
end end
|
97
|
+
def self_production_is_initializer?() if self_production_is_call? then
|
98
|
+
if (AbstractSyntaxTree.new(production[1], @interpretation_context).type == Tokens.const) then
|
99
|
+
return true if (production[2] == :new)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
false
|
103
|
+
end
|
104
|
+
def self_production_is_rolemethod_call?() can_be = self_production_is_call?
|
105
|
+
if can_be then
|
106
|
+
instance = AbstractSyntaxTree.new(production[1], @interpretation_context)
|
107
|
+
can_be = (instance.type == Tokens.role)
|
108
|
+
if can_be then
|
109
|
+
instance_data = instance.data[0]
|
110
|
+
role = @interpretation_context.roles[instance_data]
|
111
|
+
data = production[2]
|
112
|
+
can_be = role.has_key?(data)
|
113
|
+
@data = [data, instance_data]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
can_be
|
117
|
+
end
|
118
|
+
attr_reader :interpretation_context, :queue, :production
|
119
|
+
|
120
|
+
end
|
data/lib/AstRewritter.rb
CHANGED
@@ -1,65 +1,60 @@
|
|
1
1
|
class AstRewritter
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
role_names = []
|
24
|
-
@interpretation_context.each { |k, v| (role_names << k.to_s) }
|
25
|
-
raise(((aliased_role.to_s + " is not a role. Available roles are ") + role_names.join(",")))
|
26
|
-
end
|
27
|
-
aliased_field = ("@" + aliased_role.to_s).to_sym
|
28
|
-
temp_symbol = ("temp____" + aliased_role.to_s).to_sym
|
29
|
-
assignment = Sexp.new
|
30
|
-
assignment[0] = :iasgn
|
31
|
-
assignment[1] = aliased_field
|
32
|
-
load_arg = Sexp.new
|
33
|
-
load_arg[0] = :lvar
|
34
|
-
load_arg[1] = local
|
35
|
-
assignment[2] = load_arg
|
36
|
-
block.insert(1, assignment)
|
37
|
-
assignment = Sexp.new
|
38
|
-
assignment[0] = :lasgn
|
39
|
-
assignment[1] = temp_symbol
|
40
|
-
load_field = Sexp.new
|
41
|
-
load_field[0] = :ivar
|
42
|
-
load_field[1] = aliased_field
|
43
|
-
assignment[2] = load_field
|
44
|
-
block.insert(1, assignment)
|
45
|
-
assignment = Sexp.new
|
46
|
-
assignment[0] = :iasgn
|
47
|
-
assignment[1] = aliased_field
|
48
|
-
load_temp = Sexp.new
|
49
|
-
load_temp[0] = :lvar
|
50
|
-
load_temp[1] = temp_symbol
|
51
|
-
assignment[2] = load_temp
|
52
|
-
block[block.length] = assignment
|
53
|
-
end
|
54
|
-
else
|
55
|
-
# do nothing
|
2
|
+
def initialize(ast,interpretation_context) @ast = AbstractSyntaxTree.new(ast, interpretation_context)
|
3
|
+
@roles = interpretation_context.roles
|
4
|
+
end
|
5
|
+
def rewrite!() ast.each_production do |production|
|
6
|
+
case production.type
|
7
|
+
when Tokens.rolemethod_call then
|
8
|
+
data = production.data
|
9
|
+
production[2] = ((("self_" + data[1].to_s) + "_") + data[0].to_s).to_sym
|
10
|
+
production[1] = nil
|
11
|
+
when Tokens.block_with_bind then
|
12
|
+
block = production.last
|
13
|
+
block.delete_at(1)
|
14
|
+
production.data.each do |local, aliased_role|
|
15
|
+
must_b_sym = "aliased_role must be a Symbol".to_sym
|
16
|
+
local_must_b_sym = "local must be a Symbol".to_sym
|
17
|
+
raise(must_b_sym) unless aliased_role.instance_of?(Symbol)
|
18
|
+
raise(local_must_b_sym) unless local.instance_of?(Symbol)
|
19
|
+
unless @roles.has_key?(aliased_role) then
|
20
|
+
role_names = []
|
21
|
+
@interpretation_context.each { |k, v| (role_names << k.to_s) }
|
22
|
+
raise(((aliased_role.to_s + " is not a role. Available roles are ") + role_names.join(",")))
|
56
23
|
end
|
24
|
+
aliased_field = ("@" + aliased_role.to_s).to_sym
|
25
|
+
temp_symbol = ("temp____" + aliased_role.to_s).to_sym
|
26
|
+
assignment = Sexp.new
|
27
|
+
assignment[0] = :iasgn
|
28
|
+
assignment[1] = aliased_field
|
29
|
+
load_arg = Sexp.new
|
30
|
+
load_arg[0] = :lvar
|
31
|
+
load_arg[1] = local
|
32
|
+
assignment[2] = load_arg
|
33
|
+
block.insert(1, assignment)
|
34
|
+
assignment = Sexp.new
|
35
|
+
assignment[0] = :lasgn
|
36
|
+
assignment[1] = temp_symbol
|
37
|
+
load_field = Sexp.new
|
38
|
+
load_field[0] = :ivar
|
39
|
+
load_field[1] = aliased_field
|
40
|
+
assignment[2] = load_field
|
41
|
+
block.insert(1, assignment)
|
42
|
+
assignment = Sexp.new
|
43
|
+
assignment[0] = :iasgn
|
44
|
+
assignment[1] = aliased_field
|
45
|
+
load_temp = Sexp.new
|
46
|
+
load_temp[0] = :lvar
|
47
|
+
load_temp[1] = temp_symbol
|
48
|
+
assignment[2] = load_temp
|
49
|
+
block[block.length] = assignment
|
57
50
|
end
|
51
|
+
else
|
52
|
+
# do nothing
|
58
53
|
end
|
59
|
-
|
60
|
-
|
54
|
+
end end
|
55
|
+
private
|
61
56
|
|
62
57
|
|
63
|
-
|
58
|
+
attr_reader :ast
|
64
59
|
|
65
|
-
end
|
60
|
+
end
|
data/lib/Context.rb
CHANGED
@@ -1,133 +1,111 @@
|
|
1
1
|
class Context
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
i = (i - 1)
|
57
|
-
else
|
58
|
-
if (exp[0] == :call) and ((exp[1] == nil) and (exp[2] == :private)) then
|
59
|
-
@private = true
|
60
|
-
end
|
61
|
-
end
|
2
|
+
def self.define(*args,&block) name, base_class, default_interaction = *args
|
3
|
+
if default_interaction and (not base_class.instance_of?(Class)) then
|
4
|
+
base_class = eval(base_class.to_s)
|
5
|
+
end
|
6
|
+
if base_class and ((not default_interaction) and (not base_class.instance_of?(Class))) then
|
7
|
+
base_class, default_interaction = default_interaction, base_class
|
8
|
+
end
|
9
|
+
@with_contracts ||= nil
|
10
|
+
ctx = self.send(:create_context_factory, name, base_class, default_interaction, block)
|
11
|
+
if self.generate_dependency_graph then
|
12
|
+
dependencies = {}
|
13
|
+
ctx.dependencies = DependencyGraphModel.new(DependencyGraph.new(name, ctx.roles, ctx.interactions, dependencies).create!)
|
14
|
+
end
|
15
|
+
transformer = Transformer.new(name, ctx.roles, ctx.interactions, ctx.private_interactions, base_class, default_interaction)
|
16
|
+
ctx.generated_class = transformer.transform(generate_files_in, @with_contracts)
|
17
|
+
ctx
|
18
|
+
end
|
19
|
+
def self.generate_files_in() @generate_files_in end
|
20
|
+
def self.generate_files_in=(folder) @generate_files_in = folder end
|
21
|
+
def self.generate_code=(value) @generate_code = value end
|
22
|
+
def self.generate_dependency_graph=(value) @generate_dependency_graph = value end
|
23
|
+
def self.generate_code() (@generate_code or ((not generate_dependency_graph) or generate_files_in)) end
|
24
|
+
def self.generate_dependency_graph() @generate_dependency_graph end
|
25
|
+
def dependencies() @dependencies end
|
26
|
+
def generated_class() @generated_class end
|
27
|
+
def dependencies=(value) @dependencies = value end
|
28
|
+
def generated_class=(value) @generated_class = value end
|
29
|
+
def roles() @roles end
|
30
|
+
def interactions() @interactions end
|
31
|
+
def private_interactions() @private_interactions end
|
32
|
+
private
|
33
|
+
def get_definitions(b) sexp = b.to_sexp
|
34
|
+
unless is_definition?(sexp[3]) then
|
35
|
+
sexp = sexp[3]
|
36
|
+
sexp = sexp.select { |exp| is_definition?(exp) } if sexp
|
37
|
+
sexp ||= []
|
38
|
+
end
|
39
|
+
sexp.select { |exp| is_definition?(exp) }
|
40
|
+
end
|
41
|
+
def self.create_context_factory(name,base_class,default_interaction,block) ctx = Context.new(name, base_class, default_interaction)
|
42
|
+
ctx.instance_eval do
|
43
|
+
sexp = block.to_sexp
|
44
|
+
temp_block = sexp[3]
|
45
|
+
i = 0
|
46
|
+
while (i < temp_block.length) do
|
47
|
+
exp = temp_block[i]
|
48
|
+
unless temp_block[(i - 2)] and ((temp_block[(i - 2)][0] == :call) and (temp_block[(i - 1)] and (temp_block[(i - 1)][0] == :args))) then
|
49
|
+
if ((exp[0] == :defn) or (exp[0] == :defs)) then
|
50
|
+
add_method(exp)
|
51
|
+
temp_block.delete_at(i)
|
52
|
+
i = (i - 1)
|
53
|
+
else
|
54
|
+
if (exp[0] == :call) and ((exp[1] == nil) and (exp[2] == :private)) then
|
55
|
+
@private = true
|
62
56
|
end
|
63
|
-
i = (i + 1)
|
64
57
|
end
|
65
|
-
ctx.instance_eval(&block)
|
66
|
-
end
|
67
|
-
ctx
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.with_contracts(*args)
|
71
|
-
return @@with_contracts if (args.length == 0)
|
72
|
-
value = args[0]
|
73
|
-
if @@with_contracts and (not value) then
|
74
|
-
raise("make up your mind! disabling contracts during execution will result in undefined behavior")
|
75
|
-
end
|
76
|
-
@@with_contracts = value
|
77
|
-
end
|
78
|
-
|
79
|
-
def is_definition?(exp)
|
80
|
-
exp and ((exp[0] == :defn) or (exp[0] == :defs))
|
81
|
-
end
|
82
|
-
|
83
|
-
def role(*args, &b)
|
84
|
-
role_name = args[0]
|
85
|
-
@defining_role = role_name
|
86
|
-
@roles = {} unless @roles
|
87
|
-
@roles[role_name] = Hash.new
|
88
|
-
if block_given? then
|
89
|
-
definitions = get_definitions(b)
|
90
|
-
definitions.each { |exp| add_method(exp) }
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def get_methods(*args, &b)
|
95
|
-
name = args[0]
|
96
|
-
sources = (@defining_role ? (@roles[@defining_role]) : (@interactions))[name]
|
97
|
-
if @defining_role and (not sources) then
|
98
|
-
@roles[@defining_role][name] = []
|
99
|
-
else
|
100
|
-
@private_interactions[name] = true if @private
|
101
|
-
@interactions[name] = []
|
102
58
|
end
|
59
|
+
i = (i + 1)
|
103
60
|
end
|
61
|
+
ctx.instance_eval(&block)
|
62
|
+
end
|
63
|
+
ctx
|
64
|
+
end
|
65
|
+
def self.with_contracts(*args) return @with_contracts if (args.length == 0)
|
66
|
+
value = args[0]
|
67
|
+
if @with_contracts and (not value) then
|
68
|
+
raise("make up your mind! disabling contracts during execution will result in undefined behavior")
|
69
|
+
end
|
70
|
+
@with_contracts = value
|
71
|
+
end
|
72
|
+
def is_definition?(exp) exp and ((exp[0] == :defn) or (exp[0] == :defs)) end
|
73
|
+
def role(*args,&b) role_name = args[0]
|
74
|
+
@defining_role = role_name
|
75
|
+
@roles = {} unless @roles
|
76
|
+
@roles[role_name] = Hash.new
|
77
|
+
if block_given? then
|
78
|
+
definitions = get_definitions(b)
|
79
|
+
definitions.each { |exp| add_method(exp) }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
def get_methods(*args,&b) name = args[0]
|
83
|
+
sources = (@defining_role ? (@roles[@defining_role]) : (@interactions))[name]
|
84
|
+
if @defining_role and (not sources) then
|
85
|
+
@roles[@defining_role][name] = []
|
86
|
+
else
|
87
|
+
@private_interactions[name] = true if @private
|
88
|
+
@interactions[name] = []
|
89
|
+
end
|
90
|
+
end
|
91
|
+
def add_method(definition) name = if definition[1].instance_of?(Symbol) then
|
92
|
+
definition[1]
|
93
|
+
else
|
94
|
+
((definition[1].select { |e| e.instance_of?(Symbol) }.map { |e| e.to_s }.join(".") + ".") + definition[2].to_s).to_sym
|
95
|
+
end
|
96
|
+
sources = get_methods(name)
|
97
|
+
(sources << definition)
|
98
|
+
end
|
99
|
+
def private() @private = true end
|
100
|
+
def initialize(name,base_class,default_interaction) @roles = {}
|
101
|
+
@interactions = {}
|
102
|
+
@private_interactions = {}
|
103
|
+
@role_alias = {}
|
104
|
+
@name = name
|
105
|
+
@base_class = base_class
|
106
|
+
@default_interaction = default_interaction
|
107
|
+
end
|
104
108
|
|
105
|
-
|
106
|
-
name = if definition[1].instance_of?(Symbol) then
|
107
|
-
definition[1]
|
108
|
-
else
|
109
|
-
((definition[1].select { |e| e.instance_of?(Symbol) }.map { |e| e.to_s }.join(".") + ".") + definition[2].to_s).to_sym
|
110
|
-
end
|
111
|
-
sources = get_methods(name)
|
112
|
-
(sources << definition)
|
113
|
-
end
|
114
|
-
|
115
|
-
def private()
|
116
|
-
@private = true
|
117
|
-
end
|
118
|
-
|
119
|
-
def initialize(name, base_class, default_interaction)
|
120
|
-
@roles = {}
|
121
|
-
@interactions = {}
|
122
|
-
@private_interactions = {}
|
123
|
-
@role_alias = {}
|
124
|
-
@name = name
|
125
|
-
@base_class = base_class
|
126
|
-
@default_interaction = default_interaction
|
127
|
-
end
|
128
|
-
|
129
|
-
attr_reader :name
|
130
|
-
attr_reader :base_class
|
131
|
-
attr_reader :default_interaction
|
109
|
+
attr_reader :name, :base_class, :default_interaction
|
132
110
|
|
133
|
-
end
|
111
|
+
end
|