diff --git a/Library/Homebrew/abstract_command.rb b/Library/Homebrew/abstract_command.rb index 82fcdf4994..28d364bec8 100644 --- a/Library/Homebrew/abstract_command.rb +++ b/Library/Homebrew/abstract_command.rb @@ -1,6 +1,8 @@ # typed: strong # frozen_string_literal: true +require "command_registry" + module Homebrew class AbstractCommand extend T::Helpers @@ -12,13 +14,9 @@ module Homebrew sig { params(subclass: T.class_of(AbstractCommand)).void } def inherited(subclass) super - @cmds ||= T.let({}, T.nilable(T::Hash[String, T.class_of(AbstractCommand)])) - @cmds[subclass.command_name] = subclass + CommandRegistry.register(subclass) end - sig { params(name: String).returns(T.nilable(T.class_of(AbstractCommand))) } - def command(name) = @cmds&.[](name) - sig { returns(String) } def command_name = T.must(name).split("::").fetch(-1).downcase end diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 2e785889bc..04495f6f6e 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -84,7 +84,7 @@ begin end if internal_cmd || Commands.external_ruby_v2_cmd_path(cmd) - cmd_class = Homebrew::AbstractCommand.command(T.must(cmd)) + cmd_class = Homebrew::CommandRegistry.command(T.must(cmd)) if cmd_class cmd_class.new.run else diff --git a/Library/Homebrew/command_registry.rb b/Library/Homebrew/command_registry.rb new file mode 100644 index 0000000000..59779f7b58 --- /dev/null +++ b/Library/Homebrew/command_registry.rb @@ -0,0 +1,19 @@ +# typed: strong +# frozen_string_literal: true + +module Homebrew + module CommandRegistry + extend T::Helpers + + Cmd = T.type_alias { T.class_of(AbstractCommand) } # rubocop:disable Style/MutableConstant + + sig { params(subclass: Cmd).void } + def self.register(subclass) + @cmds ||= T.let({}, T.nilable(T::Hash[String, Cmd])) + @cmds[subclass.command_name] = subclass + end + + sig { params(name: String).returns(T.nilable(Cmd)) } + def self.command(name) = @cmds&.[](name) + end +end