class Roda::RodaPlugins::Rodauth::DSL

def _def_auth_method(meth, &block)

def _def_auth_method(meth, &block)
  @auth.send(:define_method, meth, &block)
end

def def_auth_block_method(meth)

def def_auth_block_method(meth)
  define_sclass_method(meth) do |&block|
    _def_auth_method(meth){block}
  end
end

def def_auth_method(meth)

def def_auth_method(meth)
  define_sclass_method(meth) do |&block|
    _def_auth_method(meth, &block)
  end
end

def def_auth_value_method(meth)

def def_auth_value_method(meth)
  define_sclass_method(meth) do |*v, &block|
    v = v.first
    block ||= proc{v}
    _def_auth_method(meth, &block)
  end
end

def define_sclass_method(meth, &block)

def define_sclass_method(meth, &block)
  (class << self; self end).send(:define_method, meth, &block)
end

def enable(*features)

def enable(*features)
  new_features = features - @auth.features
  new_features.each{|f| load_feature(f)}
  @auth.features.concat(new_features)
end

def initialize(auth, &block)

def initialize(auth, &block)
  @auth = auth
  load_feature(:base)
  instance_exec(&block)
end

def load_feature(feature_name)

def load_feature(feature_name)
  require "roda/plugins/rodauth/#{feature_name}"
  feature = FEATURES[feature_name]
  enable(*feature.dependencies)
  DSL_META_TYPES.each do |type|
    feature.send(:"#{type}_methods").each{|m| send(:"def_#{type}_method", m)}
  end
  if get_block = feature.get_block
    def_auth_block_method :"#{feature_name}_get_block"
    _def_auth_method(:"#{feature_name}_get_block"){get_block}
  end
  if post_block = feature.post_block
    def_auth_block_method :"#{feature_name}_post_block"
    _def_auth_method(:"#{feature_name}_post_block"){post_block}
  end
  route_block = feature.route_block
  if route_block || (get_block && post_block)
    check_before_meth = :"check_before_#{feature_name}"
    before_meth = :"before_#{feature_name}"
    def_auth_block_method :"#{feature_name}_route_block"
    route_block ||= proc do |r, auth|
      r.is auth.send(:"#{feature_name}_route") do
        auth.check_before(feature)
        auth.send(before_meth)
        r.get do
          instance_exec(r, auth, &auth.send(:"#{feature_name}_get_block"))
        end
        r.post do
          instance_exec(r, auth, &auth.send(:"#{feature_name}_post_block"))
        end
      end
    end
    _def_auth_method(:"#{feature_name}_route_block"){route_block}
    _def_auth_method(before_meth){nil}
    def_auth_method(before_meth)
    @auth.route_block_methods << :"#{feature_name}_route_block"
  end
  @auth.send(:include, feature)
end