class Trenni::Template

def self.buffer(binding)

Returns the buffer used for capturing output.
def self.buffer(binding)
	binding.local_variable_get(OUT)
end

def self.capture(*args, &block)

Returns the output produced by calling the given block.
def self.capture(*args, &block)
	scope = block.binding
	output_buffer = scope.local_variable_get(OUT)
	
	capture_buffer = String.new.force_encoding(output_buffer.encoding)
	scope.local_variable_set(OUT, capture_buffer)
	
	begin
		block.call(*args)
	ensure
		scope.local_variable_set(OUT, output_buffer)
	end
	
	return capture_buffer
end

def self.load_file(path, *args)

def self.load_file(path, *args)
	self.new(FileBuffer.new(path), *args).freeze
end

def code

def code
	@code ||= compile!
end

def compile!

def compile!
	assembler = make_assembler
	
	Parsers.parse_template(@buffer, assembler)
	
	assembler.code
end

def freeze

def freeze
	return self if frozen?
	
	to_proc
	
	super
end

def initialize(buffer)

def initialize(buffer)
	@buffer = buffer
end

def make_assembler

def make_assembler
	Assembler.new
end

def output_buffer

def output_buffer
	String.new.force_encoding(code.encoding)
end

def to_buffer(scope)

def to_buffer(scope)
	Buffer.new(to_string(scope), path: @buffer.path)
end

def to_proc(scope = nil)

def to_proc(scope = nil)
	@compiled_proc ||= eval("proc{|#{OUT}|;#{code};#{OUT}}", scope, @buffer.path).freeze
end

def to_string(scope = Object.new, output = nil)

def to_string(scope = Object.new, output = nil)
	output ||= output_buffer
	
	scope.instance_exec(output, &to_proc)
end