Class: Module
Instance Method Summary collapse
-
#cache_method_with_params_in_production(method) ⇒ Object
Dynamically enables cache in :production and disables in another environments.
Instance Method Details
#cache_method_with_params_in_production(method) ⇒ Object
Dynamically enables cache in :production and disables in another environments. If no environment given uses non-cached version.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/crystal/support/module.rb', line 7 def cache_method_with_params_in_production method method_with_cache, method_without_cache = "#{method}_with_cache", "#{method}_without_cache" iv = "@#{method}_cache" raise "Method '#{method}' already defined!" if instance_methods.include?(method) raise "Can't cache the '#{method}' twice!" if instance_methods.include?(method_with_cache) # create cached method define_method method_with_cache do |*args| unless results = instance_variable_get(iv) results = Hash.new(NotDefined) instance_variable_set iv, results end result = results[args] if result.equal? NotDefined result = send als, *args results[args] = result end result end # listen to environment events crystal.after :config do |config| if config.production? alias_method method, method_with_cache else alias_method method, method_without_cache end end # by default uses non-cached version alias_method method, method_without_cache end |