From 13936a24f1baaf681c86ff2b70235a045dbc7aef Mon Sep 17 00:00:00 2001 From: Thierry Joyal Date: Thu, 16 Jan 2020 14:40:51 -0500 Subject: [PATCH] Context as accessor --- lib/liquid/filter.rb | 8 +------- lib/liquid/strainer_template.rb | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/liquid/filter.rb b/lib/liquid/filter.rb index 8771212..e157b4e 100644 --- a/lib/liquid/filter.rb +++ b/lib/liquid/filter.rb @@ -32,12 +32,6 @@ module Liquid end end - def initialize(context) - @context = context - end - - private - - attr_reader :context + attr_accessor :context end end diff --git a/lib/liquid/strainer_template.rb b/lib/liquid/strainer_template.rb index 1d71bce..dfff2ab 100644 --- a/lib/liquid/strainer_template.rb +++ b/lib/liquid/strainer_template.rb @@ -23,25 +23,30 @@ module Liquid raise(ArgumentError, "wrong argument type Proc (expected Liquid::Filter)") end + instance = filter.new + filter.invokable_methods.each do |method| - filter_map[method] = filter + filter_instances[method] = instance end end - def fetch_filter(method) - filter_map.fetch(method) + def invokable?(method) + filter_instances.key?(method) end - def invokable?(method) - filter_map.key?(method) + def invoke(method, context, *args) + instance = filter_instances.fetch(method) + instance.context = context + instance.public_send(method, *args) end private - def filter_map - @filter_map ||= {} + def filter_instances + @filter_instances ||= {} end + # Caching here is most likely not required anymore since we cache instances and there is only one instance per filter class. def convert_mod_to_filter(mod) @filter_classes ||= {} @filter_classes[mod] ||= begin @@ -58,10 +63,7 @@ module Liquid def invoke(method, *args) if self.class.invokable?(method) - klass = self.class.fetch_filter(method) - - instance = klass.new(@context) - instance.public_send(method, *args) + self.class.invoke(method, @context, *args) elsif @context.strict_filters raise(Liquid::UndefinedFilter, "undefined filter #{method}") else