Sha256: a07b5a72a536db9a9d2ad72b7527613436ddcb1a152fe0c6d5f3962d578fbff6
Contents?: true
Size: 1.82 KB
Versions: 3
Compression:
Stored size: 1.82 KB
Contents
module Temple # An engine is simply a chain of compilers (that often includes a parser, # some filters and a generator). # # class MyEngine < Temple::Engine # # First run MyParser, passing the :strict option # use MyParser, :strict # # # Then a custom filter # use MyFilter # # # Then some general optimizations filters # filter :MultiFlattener # filter :StaticMerger # filter :DynamicInliner # # # Finally the generator # generator :ArrayBuffer, :buffer # end # # class SpecialEngine < MyEngine # append MyCodeOptimizer # before :ArrayBuffer, Temple::Filters::Validator # replace :ArrayBuffer, Temple::Generators::RailsOutputBuffer # end # # engine = MyEngine.new(:strict => "For MyParser") # engine.call(something) # # @api public class Engine include Mixins::Options include Mixins::EngineDSL extend Mixins::EngineDSL attr_reader :chain def self.chain @chain ||= superclass.respond_to?(:chain) ? superclass.chain.dup : [] end def initialize(o = {}) super @chain = self.class.chain.dup [*options[:chain]].compact.each {|block| block.call(self) } end def call(input) call_chain.inject(input) {|m, e| e.call(m) } end protected def chain_modified! @call_chain = nil end def call_chain @call_chain ||= @chain.map do |e| name, filter, option_filter, local_options = e case filter when Class filtered_options = Hash[*option_filter.select {|k| options.include?(k) }.map {|k| [k, options[k]] }.flatten] filter.new(ImmutableHash.new(local_options, filtered_options)) when UnboundMethod filter.bind(self) else filter end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
temple-0.3.2 | lib/temple/engine.rb |
temple-0.3.1 | lib/temple/engine.rb |
temple-0.3.0 | lib/temple/engine.rb |