lib/Context.rb in maroon-0.6.5 vs lib/Context.rb in maroon-0.7.0
- old
+ new
@@ -1,187 +1,205 @@
class Context
-
-def self.define(*args,&block)
+ def self.define(*args, &block)
@@with_contracts ||= nil
-@@generate_file_path ||= nil
-(alias :method_missing :role_or_interaction_method)
-base_class, ctx, default_interaction, name = self.send(:create_context_factory, args, block)
-if (args.last.instance_of?(FalseClass) or args.last.instance_of?(TrueClass)) then
- ctx.generate_files_in(args.last)
-end
-return ctx.send(:finalize, name, base_class, default_interaction)
+ @@generate_file_path ||= nil
+ (alias :method_missing :role_or_interaction_method)
+ base_class, ctx, default_interaction, name = self.send(:create_context_factory, args, block)
+ if (args.last.instance_of?(FalseClass) or args.last.instance_of?(TrueClass)) then
+ ctx.generate_files_in(args.last)
+ end
+ return ctx.send(:finalize, name, base_class, default_interaction, @@generate_file_path, @@with_contracts)
+ end
- end
-
-def self.generate_files_in(*args,&b)
+ def self.generate_files_in(*args, &b)
if block_given? then
- return role_or_interaction_method(:generate_files_in, *args, &b)
-end
-@@generate_file_path = args[0]
+ return role_or_interaction_method(:generate_files_in, *args, &b)
+ end
+ @@generate_file_path = args[0]
+ end
- end
+ private
+ def get_definitions(b)
+ sexp = b.to_sexp
+ unless is_definition?(sexp[3]) then
+ sexp = sexp[3]
+ sexp = sexp.select { |exp| is_definition?(exp) } if sexp
+ sexp ||= []
+ end
+ sexp.select { |exp| is_definition?(exp) }
+ end
- private
-
-def self.with_contracts(*args)
+ def self.create_context_factory(args, block)
+ name, base_class, default_interaction = *args
+ if default_interaction and (not base_class.instance_of?(Class)) then
+ base_class = eval(base_class.to_s)
+ end
+ if base_class and ((not default_interaction) and (not base_class.instance_of?(Class))) then
+ base_class, default_interaction = default_interaction, base_class
+ end
+ ctx = Context.new
+ ctx.instance_eval do
+ sexp = block.to_sexp
+ temp_block = sexp[3]
+ i = 0
+ while (i < temp_block.length) do
+ exp = temp_block[i]
+ 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
+ if ((exp[0] == :defn) or (exp[0] == :defs)) then
+ add_method(exp)
+ temp_block.delete_at(i)
+ i = (i - 1)
+ else
+ if (exp[0] == :call) and ((exp[1] == nil) and (exp[2] == :private)) then
+ @private = true
+ end
+ end
+ end
+ i = (i + 1)
+ end
+ ctx.instance_eval(&block)
+ end
+ return [base_class, ctx, default_interaction, name]
+ end
+
+ def self.with_contracts(*args)
return @@with_contracts if (args.length == 0)
-value = args[0]
-if @@with_contracts and (not value) then
- raise("make up your mind! disabling contracts during execution will result in undefined behavior")
-end
-@@with_contracts = value
+ value = args[0]
+ if @@with_contracts and (not value) then
+ raise("make up your mind! disabling contracts during execution will result in undefined behavior")
+ end
+ @@with_contracts = value
+ end
- end
-
-def role(*args,&b)
+ def createInfo(definition)
+ MethodInfo.new(definition, @defining_role, @private)
+ end
+
+ def is_definition?(exp)
+ exp and ((exp[0] == :defn) or (exp[0] == :defs))
+ end
+
+ def role(*args, &b)
role_name = args[0]
-if (args.length.!=(1) or (not role_name.instance_of?(Symbol))) then
- return role_or_interaction_method(:role, *args, &b)
-end
-@defining_role = role_name
-@roles[role_name] = Hash.new
-yield if block_given?
-@defining_role = nil
+ if (args.length.!=(1) or (not role_name.instance_of?(Symbol))) then
+ return role_or_interaction_method(:role, *args, &b)
+ end
+ @defining_role = role_name
+ @roles = {} unless @roles
+ @roles[role_name] = Hash.new
+ definitions = get_definitions(b)
+ definitions.each { |exp| add_method(exp) }
+ end
- end
-
-def initialize(*args,&b)
+ def current_interpretation_context(*args, &b)
if block_given? then
- role_or_interaction_method(:initialize, *args, &b)
-else
- @roles = Hash.new
- @interactions = Hash.new
- @role_alias = Hash.new
- @contracts = Hash.new
-end
- end
-
-def private()
- @private = true
- end
-
-def current_interpretation_context(*args,&b)
- if block_given? then
- return role_or_interaction_method(:current_interpretation_context, *args, &b)
-end
-InterpretationContext.new(roles, contracts, role_alias, nil)
+ return role_or_interaction_method(:current_interpretation_context, *args, &b)
+ end
+ InterpretationContext.new(@roles, @contracts, @role_alias, nil)
+ end
- end
-
-def get_methods(*args,&b)
+ def get_methods(*args, &b)
return role_or_interaction_method(:get_methods, *args, &b) if block_given?
-name = args[0]
-sources = (@defining_role ? (@roles[@defining_role]) : (@interactions))[name]
-if @defining_role and (not sources) then
- @roles[@defining_role][name] = []
-else
- @interactions[name] = []
-end
+ name = args[0]
+ sources = (@defining_role ? (@roles[@defining_role]) : (@interactions))[name]
+ if @defining_role and (not sources) then
+ @roles[@defining_role][name] = []
+ else
+ @interactions[name] = []
+ end
+ end
- end
-
-def add_method(*args,&b)
+ def add_method(*args, &b)
return role_or_interaction_method(:add_method, *args, &b) if block_given?
-name, method = *args
-sources = get_methods(name)
-(sources << method)
+ exp = args[0]
+ info = createInfo(exp)
+ sources = get_methods(info.name)
+ (sources << info)
+ end
- end
-
-def finalize(*args,&b)
+ def finalize(*args, &b)
return role_or_interaction_method(:finalize, *args, &b) if block_given?
-name, base_class, default = *args
-code = generate_context_code(default, name)
-if @@generate_file_path then
- name = name.to_s
- complete = ((((("class " + name) + (base_class ? (("<< " + base_class.name)) : (""))) + "\n ") + code.to_s) + "\n end")
- File.open((((("./" + @@generate_file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
- f.write(complete)
+ name, base_class, default, file_path, with_contracts = *args
+ code = generate_context_code(default, name)
+ if file_path then
+ name = name.to_s
+ complete = ((((("class " + name) + (base_class ? (("<< " + base_class.name)) : (""))) + "\n ") + code.to_s) + "\n end")
+ File.open((((("./" + file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
+ f.write(complete)
+ end
+ complete
+ else
+ c = base_class ? (Class.new(base_class)) : (Class.new)
+ if with_contracts then
+ c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\nend\ndef self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\nend\ndef self.contracts\n @@contracts\nend\ndef self.contracts=(value)\n @@contracts = value\nend")
+ c.contracts = contracts
+ end
+ Kernel.const_set(name, c)
+ begin
+ temp = c.class_eval(code)
+ rescue SyntaxError
+ p(("error: " + code))
+ end
+ (temp or c)
+ end
end
- complete
-else
- c = base_class ? (Class.new(base_class)) : (Class.new)
- if @@with_contracts then
- c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\n end\n def self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\n end\n def self.contracts\n @@contracts\n end\n def self.contracts=(value)\n raise 'Contracts must be supplied' unless value\n @@contracts = value\n end")
- c.contracts = contracts
- end
- Kernel.const_set(name, c)
- temp = c.class_eval(code)
- (temp or c)
-end
- end
-
-def self.create_context_factory(args,block)
- name, base_class, default_interaction = *args
-if default_interaction and (not base_class.instance_of?(Class)) then
- base_class = eval(base_class.to_s)
-end
-if base_class and ((not default_interaction) and (not base_class.instance_of?(Class))) then
- base_class, default_interaction = default_interaction, base_class
-end
-ctx = Context.new
-ctx.instance_eval(&block)
-return [base_class, ctx, default_interaction, name]
-
- end
-
-def generate_context_code(*args,&b)
+ def generate_context_code(*args, &b)
if block_given? then
- return role_or_interaction_method(:generate_context_code, *args, &b)
-end
-default, name = args
-getters = ""
-impl = ""
-interactions = ""
-@interactions.each do |method_name, methods|
- methods.each do |method|
- @defining_role = nil
- code = (" " + method.build_as_context_method(method_name, current_interpretation_context))
- method.is_private ? ((getters << code)) : ((interactions << code))
- end
-end
-if default then
- (interactions << (((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n "))
- (interactions << (("\n def call(*args);" + default.to_s) + " *args; end\n"))
-end
-@roles.each do |role, methods|
- (getters << (("attr_reader :" + role.to_s) + "\n "))
- methods.each do |method_name, method_sources|
- unless (method_sources.length < 2) then
- raise(("Duplicate definition of " + method_name.to_s))
+ return role_or_interaction_method(:generate_context_code, *args, &b)
end
- unless (method_sources.length > 0) then
- raise(("No source for " + method_name.to_s))
+ default, name = args
+ getters = ""
+ impl = ""
+ interactions = ""
+ @interactions.each do |method_name, methods|
+ methods.each do |method|
+ @defining_role = nil
+ code = (" " + method.build_as_context_method(current_interpretation_context))
+ method.is_private ? ((getters << code)) : ((interactions << code))
+ end
end
- method_source = method_sources[0]
- @defining_role = role
- rewritten_method_name = ((("self_" + role.to_s) + "_") + method_name.to_s)
- definition = method_source.build_as_context_method(rewritten_method_name, current_interpretation_context)
- (impl << (" " + definition.to_s)) if definition
+ if default then
+ (interactions << (((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n "))
+ (interactions << (("\n def call(*args);" + default.to_s) + " *args; end\n"))
+ end
+ @roles.each do |role, methods|
+ (getters << (("attr_reader :" + role.to_s) + "\n "))
+ methods.each do |method_name, method_sources|
+ unless (method_sources.length < 2) then
+ raise(("Duplicate definition of " + method_name.to_s))
+ end
+ unless (method_sources.length > 0) then
+ raise(("No source for " + method_name.to_s))
+ end
+ method_source = method_sources[0]
+ @defining_role = role
+ definition = method_source.build_as_context_method(current_interpretation_context)
+ (impl << (" " + definition.to_s)) if definition
+ end
+ end
+ private_string = (getters + impl).strip!.!=("") ? ("\n private\n") : ("")
+ impl = impl.strip!.!=("") ? ((("\n " + impl) + "\n ")) : ("\n ")
+ (((interactions + private_string) + getters) + impl)
end
-end
-(((((interactions + "\n private\n") + getters) + "\n ") + impl) + "\n ")
- end
-
-def role_or_interaction_method(*arguments,&b)
+ def role_or_interaction_method(*arguments, &b)
method_name, on_self = *arguments
-unless method_name.instance_of?(Symbol) then
- on_self = method_name
- method_name = :role_or_interaction_method
-end
-raise(("Method with out block " + method_name.to_s)) unless block_given?
-add_method(method_name, MethodInfo.new(on_self, b.to_sexp, @private))
+ unless method_name.instance_of?(Symbol) then
+ on_self = method_name
+ method_name = :role_or_interaction_method
+ end
+ raise(("Method with out block " + method_name.to_s)) unless block_given?
+ end
- end
-attr_reader :roles
- attr_reader :interactions
- attr_reader :defining_role
- attr_reader :role_alias
- attr_reader :alias_list
- attr_reader :cached_roles_and_alias_list
- attr_reader :contracts
-
-
-
- end
+ def private()
+ @private = true
+ end
+
+ def initialize()
+ @roles = {}
+ @interactions = {}
+ @role_alias = {}
+ end
+
+
+end
\ No newline at end of file