Sha256: 537203592e4d9bfc5e0d506648e49afc29f8b7b58d4278be8e7b2c38d1b026f8
Contents?: true
Size: 1.73 KB
Versions: 2
Compression:
Stored size: 1.73 KB
Contents
module Celluloid # Calls represent requests to an actor class Call attr_reader :method, :arguments, :block def initialize(method, arguments = [], block = nil) @retry = 0 @method = method @arguments = arguments if block if Celluloid.exclusive? # FIXME: nicer exception raise "Cannot execute blocks on sender in exclusive mode" end @block = Proxy::Block.new(Celluloid.mailbox, self, block) else @block = nil end end def execute_block_on_receiver @block && @block.execution = :receiver end def dispatch(obj) check(obj) obj.public_send(@method, *@arguments, &(@block && @block.to_proc)) end 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 if @arguments.size != arity e = ArgumentError.new("wrong number of arguments (#{@arguments.size} for #{arity})") e.set_backtrace(caller << "#{meth.source_location.join(':')}: in `#{meth.name}`") raise e end elsif arity < -1 mandatory_args = -arity - 1 if arguments.size < mandatory_args e = ArgumentError.new("wrong number of arguments (#{@arguments.size} for #{mandatory_args}+)") e.set_backtrace(caller << "#{meth.source_location.join(':')}: in `#{meth.name}`") raise e end end rescue => ex raise AbortError, ex end end end require "celluloid/call/sync" require "celluloid/call/async" require "celluloid/call/block"
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
celluloid-0.18.0 | lib/celluloid/calls.rb |
celluloid-0.18.0.pre2 | lib/celluloid/calls.rb |