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