module Sinatra::Templates

def compile_template(engine, data, options, views)

def compile_template(engine, data, options, views)
  eat_errors = options.delete :eat_errors
  template_cache.fetch engine, data, options, views do
    template = Tilt[engine]
    raise "Template engine not found: #{engine}" if template.nil?
    case data
    when Symbol
      body, path, line = settings.templates[data]
      if body
        body = body.call if body.respond_to?(:call)
        template.new(path, line.to_i, options) { body }
      else
        found = false
        @preferred_extension = engine.to_s
        find_template(views, data, template) do |file|
          path ||= file # keep the initial path rather than the last one
          if found = File.exist?(file)
            path = file
            break
          end
        end
        throw :layout_missing if eat_errors and not found
        template.new(path, 1, options)
      end
    when Proc, String
      body = data.is_a?(String) ? Proc.new { data } : data
      caller = settings.caller_locations.first
      path = options[:path] || caller[0]
      line = options[:line] || caller[1]
      template.new(path, line.to_i, options, &body)
    else
      raise ArgumentError, "Sorry, don't know how to render #{data.inspect}."
    end
  end
end