merged cont.
[opensuse:yast-rest-service.git] / webservice / vendor / plugins / delayed_job / lib / delayed / performable_method.rb
1 module Delayed
2   class PerformableMethod < Struct.new(:object, :method, :args)
3     CLASS_STRING_FORMAT = /^CLASS\:([A-Z][\w\:]+)$/
4     AR_STRING_FORMAT    = /^AR\:([A-Z][\w\:]+)\:(\d+)$/
5
6     def initialize(object, method, args)
7       raise NoMethodError, "undefined method `#{method}' for #{self.inspect}" unless object.respond_to?(method)
8
9       self.object = dump(object)
10       self.args   = args.map { |a| dump(a) }
11       self.method = method.to_sym
12     end
13     
14     def display_name  
15       case self.object
16       when CLASS_STRING_FORMAT then "#{$1}.#{method}"
17       when AR_STRING_FORMAT    then "#{$1}##{method}"
18       else "Unknown##{method}"
19       end      
20     end    
21
22     def perform
23       load(object).send(method, *args.map{|a| load(a)})
24     rescue ActiveRecord::RecordNotFound
25       # We cannot do anything about objects which were deleted in the meantime
26       true
27     end
28
29     private
30
31     def load(arg)
32       case arg
33       when CLASS_STRING_FORMAT then $1.constantize
34       when AR_STRING_FORMAT    then $1.constantize.find($2)
35       else arg
36       end
37     end
38
39     def dump(arg)
40       case arg
41       when Class              then class_to_string(arg)
42       when ActiveRecord::Base then ar_to_string(arg)
43       else arg
44       end
45     end
46
47     def ar_to_string(obj)
48       "AR:#{obj.class}:#{obj.id}"
49     end
50
51     def class_to_string(obj)
52       "CLASS:#{obj.name}"
53     end
54   end
55 end