class Stargate::Client::Injector
Internal: The job of Injector
is to inject remote definitions to local namespace. It does it by creating new namespaces dynamically and injecting Proxy
classes to remote objects.
Public Class Methods
new(url)
click to toggle source
# File lib/stargate/client/injector.rb, line 9 def initialize(url) @uri = URI.parse(url) @uri.scheme, codec_id = @uri.scheme.split('+') @codec = Codec.find_by_id(codec_id) @protocol = Protocol[@uri.scheme].new(@codec, @uri) @definitions = @protocol.fetch_definitions inject! end
Private Instance Methods
inject!()
click to toggle source
# File lib/stargate/client/injector.rb, line 21 def inject! log.debug("Injecting remote defintions", url: @protocol.safe_uri.to_s) protocol = @protocol @definitions.each do |metadata| klass = Class.new(Proxy) { configure_stargate_portal(protocol, metadata) } *namespaces, klass_name = metadata.name.split('::') namespace = namespaces.inject(Object) do |namespace, name| namespace.const_defined?(name) ? namespace.const_get(name) : Module.new.tap { |m| m = namespace.const_set(name, m) } end namespace.const_set(klass_name, klass) log.debug("Loaded remote class", metadata.serialize) end end