module Cutaneous
  class Template
    attr_accessor :loader, :lexer, :path

    def initialize(lexer)
      @lexer = lexer
    end

    def compiler
      @compiler ||= Compiler.new(lexer, loader)
    end

    def render(context)
      context.__loader = loader
      context.instance_eval(&template_proc)
    end

    def convert(to_syntax)
      lexer.convert(to_syntax)
    end

    def template_proc
      @template_proc ||= eval(template_proc_src, nil, path || "(cutaneous)")
    end

    def template_proc_src
      "lambda { |context| self.__buf = __buf = ''; #{script}; __buf.to_s }"
    end

    def script
      compiler.script
    end

    def block_order
      compiler.block_order
    end

    def block(block_name)
      compiler.block(block_name)
    end
  end
end