module Temple::Mixins::EngineDSL
def chain_proc_constructor(name, filter)
def chain_proc_constructor(name, filter) raise(ArgumentError, 'Proc or blocks must have arity 0 or 1') if filter.arity > 1 method_name = "FILTER #{name}" if Class === self define_method(method_name, &filter) filter = instance_method(method_name) if filter.arity == 1 proc {|engine| filter.bind(engine) } else proc do |engine| f = filter.bind(engine).call raise 'Constructor must return callable object' unless f.respond_to?(:call) f end end else (class << self; self; end).class_eval { define_method(method_name, &filter) } filter = method(method_name) proc {|engine| filter } end end