# @taroxd metadata 1.0
# @display 简化 handler 设置
# @id symbol_handler
# @help 简化命令窗口的 handler 设置
module Taroxd

  # Window_Command 的子类 include 后,会自动对场景调用 symbol 对应的
  # command_symbol 方法,无需再 set_handler。
  module SymbolHandler

    def handle?(symbol)
      super || symbol_to_command(symbol)
    end

    def call_handler(symbol)
      @handler[symbol].call if @handler.key?(symbol)
      command = symbol_to_command(symbol)
      receiver.send(command) if command
    end

    private

    # 以下方法可由子类覆盖。

    # 调用者。默认为当前场景。
    def receiver
      SceneManager.scene
    end

    def command_prefix
      'command_'
    end

    # 返回符号对应的场景方法名。
    # 场景不能响应 command_symbol 时,返回 nil。
    def symbol_to_command(symbol)
      sym = :"#{command_prefix}#{symbol}"
      sym if receiver.respond_to?(sym)
    end
  end
end