I just hit upon a technique which I haven’t seen before. It is akin to using modules to add behaviour to an object. Let me just present the technique and discuss it afterwards:

app/models/future.rb
 1 class Future < ActiveRecord::Base
 2   def execute
 3     # execute the Future
 4   end
 5 
 6   def execute_with_interval
 7     execute_without_interval
 8 
 9     if completed? && interval then
10       # schedule a copy of this Future to execute at
11       # a later date/time
12     end
13   end
14 
15   alias_method_chain :execute, :interval
16 end

A Future is an object that promises to return a result sometime in the future. I am using it here in the context of a Rails application.

Some of my futures are repeatable tasks, while others are simply one-shot, fire-and-forget. The method I want to introduce is how I added behaviour to an existing method within the same class. I did not include an extra module, nor did I introduce subclasses.

To tell you the truth, I initially implemented RecurringFuture to add the behaviour there, but I had already created a RetsFuture that includes additional behaviour specific to talking with a RETS server.

In my RecurringFuture implementation, I had already implemented #execute_with_interval and the correct #alias_method_chain. What I did is I simply pulled the code up, and deleted the now extraneous subclass.

I don’t know if this is a common technique, but I just found it very useful to have a clear separation of concerns: one method executes, the other recurs.

Search

Your Host

A picture of me

I am François Beausoleil, a Ruby on Rails and Scala developer. During the day, I work on Seevibes, a platform to measure social interactions related to TV shows. At night, I am interested many things. Read my biography.

Top Tags

Books I read and recommend

Links

Projects I work on

Projects I worked on