module NeuronCheckSystem::Plugin

Constants

KEYWORD_CLASSES

NeuronCheckへ登録したキーワード(Symbol)と、それに対応するKeywordクラスの対応を格納したマップ

Public Class Methods

__define_keyword_method_to_module(name, keyword_class) click to toggle source

キーワード用のメソッドをKeywordモジュールへ定義する

# File lib/neuroncheck/plugin.rb, line 58
def self.__define_keyword_method_to_module(name, keyword_class)
  Keywords.module_eval do
    define_method(name) do |*params|
      # キーワードを生成
      kw = keyword_class.new

      # そのキーワードのon_callメソッドを実行
      kw.on_call(*params)

      # キーワードを返す
      kw
    end
  end
end
add_keyword(name, &block) click to toggle source

キーワードの追加

# File lib/neuroncheck/plugin.rb, line 12
def self.add_keyword(name, &block)
  # すでに予約済みのキーワードであればエラー
  if KEYWORD_CLASSES[name] then
    raise PluginError, "the `#{name}' keyword has been already reserved"
  end

  # キーワードを表すクラスを作成
  keyword_class = Class.new(Keyword, &block)

  # 必要なインスタンスメソッドが全て定義されているかどうかを確認
  if not keyword_class.method_defined?(:on_call) or
  not keyword_class.method_defined?(:match?) or
  not keyword_class.method_defined?(:expected_caption) then
    raise PluginError, "##{__callee__} requires 3 method definitions - `on_call', `match?' and `expected_caption'"
  end

  # キーワードを登録
  keyword_class.instance_variable_set(:@keyword_name, name)
  KEYWORD_CLASSES[name] = keyword_class

  # キーワードメソッドを定義
  __define_keyword_method_to_module(name, keyword_class)
end
alias_keyword(name, original_keyword_name) click to toggle source

キーワードの別名を定義

# File lib/neuroncheck/plugin.rb, line 37
def self.alias_keyword(name, original_keyword_name)
  # すでに予約済みのキーワードであればエラー
  if KEYWORD_CLASSES[name] then
    raise PluginError, "the `#{name}' keyword has been already reserved"
  end

  # 元キーワードが、自分が追加したキーワードの中になければエラー
  unless KEYWORD_CLASSES[original_keyword_name] then
    raise PluginError, "the `#{original_keyword_name}' keyword hasn't been reserved yet"
  end

  # 継承して別名クラスを作成
  keyword_class = Class.new(KEYWORD_CLASSES[original_keyword_name])
  keyword_class.instance_variable_set(:@keyword_name, name)
  KEYWORD_CLASSES[name] = keyword_class

  # キーワードメソッドを定義
  __define_keyword_method_to_module(name, keyword_class)
end
remove_keyword(name) click to toggle source

キーワードの削除

# File lib/neuroncheck/plugin.rb, line 74
def self.remove_keyword(name)
  # 自分が追加したキーワードの中になければエラー
  unless KEYWORD_CLASSES[name] then
    raise PluginError, "the `#{name}' keyword hasn't been reserved yet"
  end

  # 組み込みキーワードを削除使用とした場合はエラー
  if KEYWORD_CLASSES[name].builtin_keyword? then
    raise PluginError, "the `#{name}' keyword cannot be removed because it is NeuronCheck builtin keyword"
  end

  # キーワードを表すクラスを削除
  KEYWORD_CLASSES.delete(name)

  # キーワードメソッドの定義を削除
  Keywords.module_eval do
    remove_method(name)
  end
end