1# frozen_string_literal: true 2 3module Gitlab 4 module Utils 5 module StrongMemoize 6 # Instead of writing patterns like this: 7 # 8 # def trigger_from_token 9 # return @trigger if defined?(@trigger) 10 # 11 # @trigger = Ci::Trigger.find_by_token(params[:token].to_s) 12 # end 13 # 14 # We could write it like: 15 # 16 # include Gitlab::Utils::StrongMemoize 17 # 18 # def trigger_from_token 19 # strong_memoize(:trigger) do 20 # Ci::Trigger.find_by_token(params[:token].to_s) 21 # end 22 # end 23 # 24 def strong_memoize(name) 25 if strong_memoized?(name) 26 instance_variable_get(ivar(name)) 27 else 28 instance_variable_set(ivar(name), yield) 29 end 30 end 31 32 def strong_memoized?(name) 33 instance_variable_defined?(ivar(name)) 34 end 35 36 def clear_memoization(name) 37 remove_instance_variable(ivar(name)) if instance_variable_defined?(ivar(name)) 38 end 39 40 private 41 42 def ivar(name) 43 "@#{name}" 44 end 45 end 46 end 47end 48