lib/liquid/strainer.rb in locomotivecms-liquid-2.6.0 vs lib/liquid/strainer.rb in locomotivecms-liquid-4.0.0.alpha
- old
+ new
@@ -9,10 +9,15 @@
# Context#add_filters or Template.register_filter
class Strainer #:nodoc:
@@filters = []
@@known_filters = Set.new
@@known_methods = Set.new
+ @@strainer_class_cache = Hash.new do |hash, filters|
+ hash[filters] = Class.new(Strainer) do
+ filters.each { |f| include f }
+ end
+ end
def initialize(context)
@context = context
end
@@ -30,21 +35,26 @@
@@known_methods.merge(new_methods)
@@known_filters.add(filter)
end
end
- def self.create(context)
- strainer = Strainer.new(context)
- @@filters.each { |m| strainer.extend(m) }
- strainer
+ def self.strainer_class_cache
+ @@strainer_class_cache
end
+ def self.create(context, filters = [])
+ filters = @@filters + filters
+ strainer_class_cache[filters].new(context)
+ end
+
def invoke(method, *args)
if invokable?(method)
send(method, *args)
else
args.first
end
+ rescue ::ArgumentError => e
+ raise Liquid::ArgumentError.new(e.message)
end
def invokable?(method)
@@known_methods.include?(method.to_s) && respond_to?(method)
end