Sha256: d0bf6ca1b4b8354514b408515e1e26cd67d7f1258f0a0e3ced15ec5eb7632f3a

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module Ziggy

  def self.included(base)
    base.extend ClassMethods
    base.instance_eval do
      @should_be_cached = []
      @cached = []  
      @keygens = {}
      @expire_after = {}
    end
  end

  module ClassMethods
    def cached(*cachable_methods, &block)
      opts = (cachable_methods.pop if cachable_methods.last.kind_of? Hash) || {}
      @should_be_cached += cachable_methods
      cachable_methods.each do |m| 
        @keygens[m] = block
        @expire_after[m] = opts[:expire_after] || 2.5.minutes
      end
    end
    
    def should_be_cached?(method)
      @should_be_cached.include? method
    end
    
    def cached?(method)
      @cached.include? method
    end
    
    def method_added(method)
      return unless should_be_cached?(method) && !cached?(method)
      @cached << method
      method_without_cache = "#{method}_without_cache".to_sym
      class_eval do 
        alias_method method_without_cache, method 
        define_method(method) do |*args|
          key = self.class.build_key(self, method, args)
          return Rails.cache.read(key) if Rails.cache.exist?(key)
          result = send(method_without_cache, *args)
          Rails.cache.write(key, result, :expires_in => expire_after(method))
          result
        end
      end
      logger.debug "Caching added to #{self}.#{method}"
    end    
    
    def expire_after(method)
      @expire_after[method]
    end
    
    def build_key(instance, method, args)
      invocation_key = "#{method}#{ args.collect{ |a| a.to_s } }"
      keygen = @keygens[method]
      differentiator = (keygen.call(instance) unless keygen.nil?) || ""
      differentiator + invocation_key
    end    
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
opsb-ziggy-0.1.1 lib/ziggy.rb