def end_rules
@__drp__defining_rules = :finished
all_methods = {}
@__drp__rules.each do |name, weights_and_max_depths|
methods = []
weights_and_max_depths.each_with_index do |w_md, i|
methods.push ["__drp__#{name}__#{i}"] + w_md
end
all_methods[name] = methods
define_method name do |*args|
useable_methods = @__drp__rule__methods[name].select do |meth|
meth.expressed?
end
case useable_methods.size
when 0
default_rule_method *args
when 1
__drp__call__method(useable_methods.first, args)
else
__drp__call__method(__drp__choose__method(useable_methods), args)
end
end
end
define_method :__drp__init do
@__drp__rule__methods = {}
@__drp__depth__stack = []
@__drp__rule__method__stack = []
all_methods.each do |name, arg_array|
@__drp__rule__methods[name] = arg_array.collect do |args|
RuleMethod.new self, *args
end
end
self
end
end