Wrap the given subject with an Cell
# File lib/celluloid/cell.rb, line 20 def initialize(subject, options, actor_options) @actor = Actor.new(self, actor_options) @subject = subject @receiver_block_executions = options[:receiver_block_executions] @exclusive_methods = options[:exclusive_methods] @finalizer = options[:finalizer] @subject.instance_variable_set(OWNER_IVAR, @actor) if exit_handler_name = options[:exit_handler_name] @actor.exit_handler = ExitHandler.new(self, @subject, exit_handler_name) end @actor.handle(Call) do |message| invoke(message) end @actor.handle(BlockCall) do |message| task(:invoke_block) { message.dispatch } end @actor.handle(BlockResponse, Response) do |message| message.dispatch end @actor.start @proxy = (options[:proxy_class] || CellProxy).new(@actor.proxy, @actor.mailbox, @subject.class.to_s) end
# File lib/celluloid/cell.rb, line 48 def invoke(call) meth = call.method if meth == :__send__ meth = call.arguments.first end if @receiver_block_executions && meth if @receiver_block_executions.include?(meth.to_sym) call.execute_block_on_receiver end end task(:call, meth, :dangerous_suspend => meth == :initialize) { call.dispatch(@subject) } end
Run the user-defined finalizer, if one is set
# File lib/celluloid/cell.rb, line 77 def shutdown return unless @finalizer && @subject.respond_to?(@finalizer, true) task(:finalizer, @finalizer, :dangerous_suspend => true) do begin @subject.__send__(@finalizer) rescue => ex Logger.crash("#{@subject.class} finalizer crashed!", ex) end end end
# File lib/celluloid/cell.rb, line 64 def task(task_type, method_name = nil, meta = nil, &block) meta ||= {} meta.merge!(:method_name => method_name) @actor.task(task_type, meta) do if @exclusive_methods && method_name && @exclusive_methods.include?(method_name.to_sym) Celluloid.exclusive { yield } else yield end end end
Generated with the Darkfish Rdoc Generator 2.