class Temple::Engine
engine.compile(something)
engine = MyEngine.new(:strict => “For MyParser”)
end
generator :ArrayBuffer, :buffer
# Finally the generator
filter :DynamicInliner
filter :StaticMerger
filter :MultiFlattener
# Then some general optimizations filters
use MyFilter
# Then a custom filter
use MyParser, :strict
# First run MyParser, passing the :strict option
class MyEngine < Temple::Engine
some filters and a generator).
An engine is simply a chain of compilers (that often includes a parser,
def self.filter(filter, *args, &blk)
def self.filter(filter, *args, &blk) use(Temple::Filters.const_get(filter), *args, &blk) end
def self.filters
def self.filters @filters ||= [] end
def self.generator(compiler, *args, &blk)
def self.generator(compiler, *args, &blk) use(Temple::Core.const_get(compiler), *args, &blk) end
def self.parser(parser, *args, &blk)
def self.parser(parser, *args, &blk) use(Temple::Parsers.const_get(parser), *args, &blk) end
def self.use(filter, *args, &blk)
def self.use(filter, *args, &blk) filters << [filter, args, blk] end
def compile(thing)
def compile(thing) @chain.inject(thing) { |m, e| e.compile(m) } end
def initialize(options = {})
def initialize(options = {}) @chain = self.class.filters.map do |filter, args, blk| opt = args.last.is_a?(Hash) ? args.last : {} opt = args.inject(opt) do |memo, ele| memo[ele] = options[ele] if options.has_key?(ele) memo end filter.new(opt, &blk) end end