class Celluloid::Cell - celluloid-0.16.0 Documentation

# class Celluloid::Cell

Wrap the given subject with an Cell

### Attributes

proxy[R]
subject[R]

### Public Class Methods

new(subject, options, actor_options) click to toggle source

    # 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

### Public Instance Methods

invoke(call) click to toggle source

    # 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

shutdown() click to toggle source

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

task(task_type, method_name = nil, meta = nil) { || ... } click to toggle source

    # 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