Sha256: a37703ce90b8658d16ade57f6a38d3a96c959b70ac8b9d9b767003a396efc05e
Contents?: true
Size: 1.87 KB
Versions: 5
Compression:
Stored size: 1.87 KB
Contents
require "infopark_component_cache/volatile_cache" require "infopark_component_cache/key_generator" module InfoparkComponentCache # @author Tomasz Przedmojski <tomasz.przedmojski@infopark.de> # # This module provides an easy way to create delayed guards # by using meta programming. # # @example Delaying an ObjectCount which guards on :object_count # class DelayedObjectCount < ObjectCount # include DelayedGuard # delay :object_count, for: 10.minutes # end # # @note Including classes must implement options method which # completely described the object state and returns a hash. module DelayedGuard def self.included(base) base.send(:extend, ClassMethods) end protected include VolatileCache def delayed_value(method_name) volatile_cache.read(delayed_value_key(method_name)) end def still_delayed?(method_name) volatile_cache.exist?(delayed_value_key(method_name)) end def delay_value(method_name, value, expiration) volatile_cache.write(delayed_value_key(method_name), value, expires_in: expiration) value end def delayed_value_key(method_name) KeyGenerator.generate_key(self.options.merge({ delayed_method_name: method_name, delayed_class_name: self.class.name })) end module ClassMethods def delay(method_name, options) expiration = options[:for] return unless expiration # allow to overwrite the delays alias_method :"delayed_#{method_name}", method_name unless method_defined?(:"delayed_#{method_name}") define_method method_name do value = delayed_value(method_name) if still_delayed?(method_name) value else delay_value(method_name, self.send(:"delayed_#{method_name}"), expiration) end end end end end end
Version data entries
5 entries across 5 versions & 1 rubygems