class Universa::RemoteAdapter

The basic class to write remote class adapters (extensions). Delegates contained {Ref} instance therefore behaves like remote interface with some extensions.

Key feature of RemoteAdapter class is the cross-call persistence. It means once created instances of the RemoteAdapter descendants are cached just like (in fact, instead of) {Ref} instances, so when the remote party returns the reference to the object once wrapped by this instance, the instance will be returned unless it is already garbage collected. instance will be returned, what means sort of cross-platform calls persistence.

Extending this class normally should not implement the constructor, By defaul the constructor is passed to the remote to create remote instance.

Public Class Methods

invoke_static(method_name, *args) click to toggle source
# File lib/universa/service.rb, line 167
def self.invoke_static(method_name, *args)
  Service.umi.invoke_static @remote_class_name, method_name, *args
end
new(*args) click to toggle source

Instantiate new proxy object passing arguments to the remote constructor. The UMI host will try to find overloaded constructor that matches the arguments.

@param [*Any] args any arguments that remote constructor may accept.

# File lib/universa/service.rb, line 113
def initialize(*args)
  if args.length == 1 && args[0].is_a?(ReferenceCreationData)
    @remote = args[0].ref
  else
    # User called constructor
    remote_class_name = self.class.remote_class_name
    remote_class_name&.length or raise Error, "provide remote_class_name"
    @remote = Service.umi.instantiate remote_class_name, *args, adapter: self
  end
end
remote_class(name) click to toggle source

Registers remote class name to be used with this adapted. Call it early in descendant class declaration.

# File lib/universa/service.rb, line 152
def self.remote_class name
  @remote_class_name = name
end
remote_class_name() click to toggle source

Returns remote class name. There is no need to override it, when inheriting it use remote_class helper:

class MyKeyAddress < ObjectProxy
   remote_class 'com.icodici.crypto.KeyAddress'

   #...
end

Notice: remote_class will do all necessary work for you.

@return [String] remote class name

# File lib/universa/service.rb, line 146
def self.remote_class_name
  @remote_class_name or raise Error, "provide remote class name"
end
remote_field(*names) click to toggle source
# File lib/universa/service.rb, line 171
    def self.remote_field *names
      names.each {|name|
        class_eval <<-End
          def #{name}
            Service.umi.get_field(self,"#{name}")
          end
          def #{name}=(value)
            Service.umi.set_field(self,"#{name}", value)
          end
          End
      }
    end
static_method(name) click to toggle source
# File lib/universa/service.rb, line 184
    def self.static_method name
      class_eval <<-End
        def self.#{name} *args
          invoke_static "#{name.to_s}", *args
        end
      End
    end

Public Instance Methods

__getobj__() click to toggle source

Delegated object @return [Ref] the wrapped instance whose methpds are delegated by this

# File lib/universa/service.rb, line 126
def __getobj__
  @remote
end
__setobj__() click to toggle source

Updating proxied object is not allowed. Raises error.

# File lib/universa/service.rb, line 131
def __setobj__
  raise "ObjectProxy does not support changing referenced object"
end
inspect() click to toggle source

debugging label

# File lib/universa/service.rb, line 157
def inspect
  "<#{self.class.name}:#{__id__}:#{@remote._remote_class_name}:#{@remote._remote_id}>"
end
to_s() click to toggle source

call the remote toString(). Does not cache it. @return [String]

# File lib/universa/service.rb, line 163
def to_s
  toString()
end