module Acts module Cacheable def self.included(base) base.extend(ClassMethods) end module ClassMethods def acts_as_cacheable(key, options = {}) extend Acts::Cacheable::SingletonMethods find(:all, options).each{|instance| cached_objects[instance.send(key).to_s] = instance} end end module SingletonMethods def [] (key) cached_objects[key] end def cached(id) cached_objects.each_value{|instance| return instance if instance.id == id} end def objects cached_objects.values end private def cached_objects @all_cached_objects ||= Hash.new end end end end