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
# 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
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
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
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
# 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
# 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
Delegated object @return [Ref] the wrapped instance whose methpds are delegated by this
# File lib/universa/service.rb, line 126 def __getobj__ @remote end
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
debugging label
# File lib/universa/service.rb, line 157 def inspect "<#{self.class.name}:#{__id__}:#{@remote._remote_class_name}:#{@remote._remote_id}>" end
call the remote toString(). Does not cache it. @return [String]
# File lib/universa/service.rb, line 163 def to_s toString() end