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