diff --git a/lib/delayed/message_sending.rb b/lib/delayed/message_sending.rb index 80a02f382..ed75dda36 100644 --- a/lib/delayed/message_sending.rb +++ b/lib/delayed/message_sending.rb @@ -3,5 +3,15 @@ module MessageSending def send_later(method, *args) Delayed::Job.enqueue Delayed::PerformableMethod.new(self, method.to_sym, args) end - end + + module ClassMethods + def handle_asynchronously(method) + without_name = "#{method}_without_send_later" + define_method("#{method}_with_send_later") do |*args| + send_later(without_name, *args) + end + alias_method_chain method, :send_later + end + end + end end \ No newline at end of file diff --git a/lib/delayed/worker.rb b/lib/delayed/worker.rb index 9ae672643..744e20ac8 100644 --- a/lib/delayed/worker.rb +++ b/lib/delayed/worker.rb @@ -4,10 +4,10 @@ class Worker cattr_accessor :logger self.logger = if defined?(Merb::Logger) - Merb.logger - elsif defined?(RAILS_DEFAULT_LOGGER) - RAILS_DEFAULT_LOGGER - end + Merb.logger + elsif defined?(RAILS_DEFAULT_LOGGER) + RAILS_DEFAULT_LOGGER + end def initialize(options={}) @quiet = options[:quiet] diff --git a/lib/delayed_job.rb b/lib/delayed_job.rb index 9c9206cb0..482cb2ff0 100644 --- a/lib/delayed_job.rb +++ b/lib/delayed_job.rb @@ -5,7 +5,8 @@ require File.dirname(__FILE__) + '/delayed/job' require File.dirname(__FILE__) + '/delayed/worker' -Object.send(:include, Delayed::MessageSending) +Object.send(:include, Delayed::MessageSending) +Module.send(:include, Delayed::MessageSending::ClassMethods) if defined?(Merb::Plugins) Merb::Plugins.add_rakefiles File.dirname(__FILE__) / '..' / 'tasks' / 'tasks' diff --git a/spec/database.rb b/spec/database.rb index 20ae53da5..505b06fa9 100644 --- a/spec/database.rb +++ b/spec/database.rb @@ -35,5 +35,8 @@ # Purely useful for test cases... class Story < ActiveRecord::Base - def tell; text; end + def tell; text; end + def whatever(n, _); tell*n; end + + handle_asynchronously :whatever end diff --git a/spec/delayed_method_spec.rb b/spec/delayed_method_spec.rb index 9d089ffa9..25be6dac1 100644 --- a/spec/delayed_method_spec.rb +++ b/spec/delayed_method_spec.rb @@ -112,6 +112,21 @@ def read(story) job.payload_object.method.should == :read job.payload_object.args.should == ["AR:Story:#{story.id}"] job.payload_object.perform.should == 'Epilog: Once upon...' + end + + it "should call send later on methods which are wrapped with handle_asynchronously" do + story = Story.create :text => 'Once upon...' + + Delayed::Job.count.should == 0 + + story.whatever(1, 5) + + Delayed::Job.count.should == 1 + job = Delayed::Job.find(:first) + job.payload_object.class.should == Delayed::PerformableMethod + job.payload_object.method.should == :whatever_without_send_later + job.payload_object.args.should == [1, 5] + job.payload_object.perform.should == 'Once upon...' end end \ No newline at end of file