class Celluloid::Call
Calls represent requests to an actor
Attributes
arguments[R]
block[R]
method[R]
Public Class Methods
new(method, arguments = [], block = nil)
click to toggle source
# File lib/celluloid/calls.rb, line 6 def initialize(method, arguments = [], block = nil) @retry = 0 @method = method @arguments = arguments if block if Celluloid.exclusive? # FIXME: nicer exception fail "Cannot execute blocks on sender in exclusive mode" end @block = Proxy::Block.new(Celluloid.mailbox, self, block) else @block = nil end end
Public Instance Methods
check(obj)
click to toggle source
# File lib/celluloid/calls.rb, line 37 def check(obj) # NOTE: don't use respond_to? here begin meth = obj.method(@method) rescue NameError raise NoMethodError, "undefined method `#{@method}' for #<#{obj.class}:0x#{obj.object_id.to_s(16)}>" end arity = meth.arity if arity >= 0 fail ArgumentError, "wrong number of arguments (#{@arguments.size} for #{arity})" if @arguments.size != arity elsif arity < -1 mandatory_args = -arity - 1 fail ArgumentError, "wrong number of arguments (#{@arguments.size} for #{mandatory_args}+)" if arguments.size < mandatory_args end rescue => ex raise AbortError.new(ex) end
dispatch(obj)
click to toggle source
# File lib/celluloid/calls.rb, line 25 def dispatch(obj) check(obj) _b = @block && @block.to_proc obj.public_send(@method, *@arguments, &_b) # rescue Celluloid::TaskTimeout => ex # raise ex unless ( @retry += 1 ) <= RETRY_CALL_LIMIT # puts "retrying" # Internals::Logger.warn("TaskTimeout at Call dispatch. Retrying in #{RETRY_CALL_WAIT} seconds. ( Attempt #{@retry} of #{RETRY_CALL_LIMIT} )") # sleep RETRY_CALL_WAIT # retry end
execute_block_on_receiver()
click to toggle source
# File lib/celluloid/calls.rb, line 21 def execute_block_on_receiver @block && @block.execution = :receiver end