class Ribbon::Intercom::Package

Attributes

sdk[R]

Public Class Methods

_package_obj(subject, data=nil) click to toggle source
# File lib/ribbon/intercom/package.rb, line 27
def _package_obj(subject, data=nil)
  new(encode_subject(subject), data)
end
decode_subject(encoded_subject) click to toggle source
# File lib/ribbon/intercom/package.rb, line 35
def decode_subject(encoded_subject)
  Marshal.load(encoded_subject)
end
encode_subject(subject) click to toggle source
# File lib/ribbon/intercom/package.rb, line 31
def encode_subject(subject)
  Marshal.dump(subject)
end
init_packages(object, sdk) click to toggle source

Walks the object and initializes all packages (i.e., sets them up to be accessed by the end-user on the client).

# File lib/ribbon/intercom/package.rb, line 42
def init_packages(object, sdk)
  Utils.walk(object) { |object|
    object.send(:_init, sdk) if object.is_a?(Package)
    object
  }
end
new(subject_data=nil, data=nil) click to toggle source
# File lib/ribbon/intercom/package.rb, line 52
def initialize(subject_data=nil, data=nil)
  @_subject_data = subject_data
  @_data = data
end
package(subject) click to toggle source

Package up any non-basic objects that include Packageable::Mixin.

# File lib/ribbon/intercom/package.rb, line 10
def package(subject)
  Utils.walk(subject) { |subject, context|
    if Utils.basic_type?(subject)
      subject
    elsif context == :hash_key
      # Hash keys must be basic types.
      raise Errors::UnsafeResponseError, subject.inspect
    elsif subject.is_a?(Packageable::Mixin)
      _package_obj(subject, package(subject.package_data))
    elsif subject.is_a?(Class) && subject < Packageable::Mixin
      _package_obj(subject)
    else
      raise Errors::UnsafeResponseError, subject.inspect
    end
  }
end

Public Instance Methods

begin() click to toggle source

Begin a method chain (must be completed with ‘#end`).

When ‘#end` is called on the method chain, the chain will be resolved remotely. This allows the chain of methods to be executed in one round-trip.

# File lib/ribbon/intercom/package.rb, line 62
def begin
  Utils::MethodChain.begin { |methods|
    queue = Packet::MethodQueue.new
    methods.each { |meth, *args| queue.enqueue(meth, *args) }
    _send_method_queue(queue)
  }
end

Private Instance Methods

_call(method_name, *args) click to toggle source

Call a method on the subject remotely.

# File lib/ribbon/intercom/package.rb, line 84
def _call(method_name, *args)
  _send_method_queue(Packet::MethodQueue.new.enqueue(method_name, *args))
end
_init(sdk) click to toggle source

Initializes the package on the client-side.

# File lib/ribbon/intercom/package.rb, line 90
def _init(sdk)
  @sdk = sdk
  self.class.init_packages(@_data, sdk)
  mock_safe! if sdk.mock_safe?
end
_process_response(packet) click to toggle source
# File lib/ribbon/intercom/package.rb, line 114
def _process_response(packet)
  @_subject_data = packet.subject
  @_data = self.class.init_packages(packet.package_data, sdk)

  packet.retval
end
_send_method_queue(method_queue) click to toggle source
# File lib/ribbon/intercom/package.rb, line 96
def _send_method_queue(method_queue)
  _process_response(
    sdk.send_packet(
      subject:      @_subject_data,
      method_queue: method_queue
    )
  )
end
marshal_dump() click to toggle source
# File lib/ribbon/intercom/package.rb, line 105
def marshal_dump
  [@_subject_data, @_data]
end
marshal_load(array) click to toggle source
# File lib/ribbon/intercom/package.rb, line 109
def marshal_load(array)
  @_subject_data = array[0]
  @_data = array[1]
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/ribbon/intercom/package.rb, line 72
def method_missing(meth, *args, &block)
  if @_data && @_data.key?(meth)
    @_data[meth]
  elsif sdk
    _call(meth, *args)
  else
    super
  end
end