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