class Loom::Mods::ModLoader

Public Class Methods

new(loom_config) click to toggle source
# File lib/loom/mods/mod_loader.rb, line 9
def initialize(loom_config)
  @loom_config = loom_config
end

Private Class Methods

alias_module(klass, alias_name) click to toggle source
# File lib/loom/mods/mod_loader.rb, line 73
def alias_module(klass, alias_name)
  raise ModNotRegisteredError, klass unless registered_mods[klass.name]
  raise AliasRegisteredError, alias_name if instance_methods.include? alias_name

  original_method = registered_mods[klass.name].first
  registered_mods[klass.name] << alias_name

  alias_method alias_name.to_sym, original_method
  Loom.log.debug1(self) { "mod aliased => #{original_method} as #{alias_name}" }
end
define_mod_factory(name, mod_klass) click to toggle source

TODO: add some documentation here, this is the entrypoint for all mod factories and returning the ActionProxy or running a ModBlock. This is just as hidden as ActionProxy+install_root_actions+

# File lib/loom/mods/mod_loader.rb, line 53
def define_mod_factory(name, mod_klass)
  raise ModDefinedError, name if instance_methods.include? name
  registered_mods[mod_klass.name] = [name]

  define_method name do |shell, *args, &pattern_block|
    Loom.log.debug3(self) do
      "handling mod call => #{mod_klass}##{name} #{args} #{pattern_block}"
    end
    load_mod_klass mod_klass, shell

    mod = mod_klass.new shell, @loom_config
    mod.execute *args, &pattern_block
  end
end
register_mod(klass, name, **opts) click to toggle source
# File lib/loom/mods/mod_loader.rb, line 32
def register_mod(klass, name, **opts)
  name = name.to_sym
  raise AnonymousModLoadError, 'cannot load anonymous mods' unless name
  raise ModDefinedError, name if instance_methods.include? name

  define_mod_factory name, klass
  Loom.log.debug(self) { "registered mod => #{klass} as #{name}" }

  opts.each do |k,v|
    case k
    when :alias
      [v].flatten.each { |v| alias_module klass, v }
    else
      raise "unknown option #{k}"
    end
  end
end
registered_mods() click to toggle source
# File lib/loom/mods/mod_loader.rb, line 68
def registered_mods
  @registered_mods ||= {}
end

Public Instance Methods

load_mod_klass(mod_klass, shell) click to toggle source
# File lib/loom/mods/mod_loader.rb, line 13
def load_mod_klass(mod_klass, shell)
  verify_shell_cmds mod_klass, shell
end

Private Instance Methods

verify_shell_cmds(mod_klass, shell) click to toggle source
# File lib/loom/mods/mod_loader.rb, line 18
def verify_shell_cmds(mod_klass, shell)
  Loom.log.debug2(self) { "verifying cmds for mod => #{mod_klass}" }
  mod_klass.required_commands.each do |cmd|
    begin
      shell.verify_which cmd
    rescue Loom::Shell::VerifyError
      Loom.log.error "unable to use mod #{mod_klass}, missing required command => #{cmd}"
      raise $!
    end
  end
end