module ReeRoutes::DSL::ClassMethods

def default_warden_scope(method_name)

def default_warden_scope(method_name)
  @default_warden_scope = method_name
end

def define_route(request_method, path, &proc)

def define_route(request_method, path, &proc)
  raise ArgumentError.new("routes should be called") if !@dsl
  raise ArgumentError.new("block is required") if !block_given?
  @routes ||= []
  builder = ReeRoutes::RouteBuilder.new
  builder.instance_exec(&proc)
  if @default_warden_scope && !builder.get_route.warden_scope
    builder.warden_scope(@default_warden_scope)
  end
  uri = URI.parse(path) rescue nil
  if uri.nil? || uri.path != path
    raise ArgumentError.new("invalid path provided #{path}")
  end
  if uri.query && !uri.query.empty?
    raise ArgumentError.new("route path should not include query params: #{path}")
  end
  builder.get_route.path = path
  builder.get_route.request_method = request_method
  if !builder.get_route.valid?
    raise ArgumentError.new("action, summary and auth scope should be provided for #{builder.get_route.inspect}")
  end
  route = builder.get_route
  @dsl.link(route.action.name, from: route.action.package_name)
  if route.serializer
    @dsl.link(route.serializer.name, from: route.serializer.package_name)
  end
  @routes << route
  route
end

def routes(name, &proc)

def routes(name, &proc)
  raise ArgumentError.new("block is required") if !block_given?
  @dsl = Ree::ObjectDsl.new(
    Ree.container.packages_facade, name, self, :object
  )
  @dsl.singleton
  @dsl.factory(:build)
  @dsl.tags(["routes"])
  instance_exec(&proc)
  klass = @dsl.object.klass
  klass.send(:include, FactoryMethod)
  Ree.container.compile(@dsl.package, name)
end