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