From: tim.pease@... Date: 2008-08-26T01:51:56+09:00 Subject: [ANN] expiration-date 1.1.0 (Screaming Bacon) expiration-date version 1.1.0 by Tim Pease http://codeforpeople.rubyforge.org/expiration-date (the "Screaming Bacon" release) == DESCRIPTION Really simple caching by attaching an expiration date to attributes. The ExpirationDate module adss two methods to a class -- expiring_attr and expiring_class_attr. These two methods are used to declare attributes in the instance and in the class, respectively, that will expire after some period of seconds have elapsed. The attribute is re-initialized from the given block after it has expired. This is a very simple form of caching. == CHANGES * 1 minor enhancement * added expiring class attributes == SYNOPSIS A simple example demonstrating how the block gets called after the expiration time is passed. class A include ExpirationDate expiring_attr( :foo, 60 ) { 'foo' } end a = A.new a.foo #=> 'foo' a.foo = 'bar' a.foo #=> 'bar' sleep 61 a.foo #=> 'foo' A slightly more useful example. Here we are going to extract information from a database every five minutes. This assumes you have the 'activesupport' and 'activerecord' gems installed. class MyModel < ::ActiveRecord::Base include ExpirationDate expiring_class_attr( :costly_data, 5.minutes ) { models = MyModel.find( :all, :conditions => ['costly query conditions'] ) result = models.map {|m| # costly operations here} result } end MyModel.costly_data #=> result Attributes can be expired manually, and the time it takes them to expire can be modified as well. class AgeDemo include ExpirationDate expiring_attr( :bar, 120 ) { Time.now } end demo = AgeDemo.new demo.bar #=> now sleep 60 demo.bar #=> 60 seconds ago demo.expire_bar_now demo.bar #=> now demo.alter_bar_age( 10 ) demo.expire_bar_now demo.bar #=> now sleep 11 demo.bar #=> now Blessings, TwP