Module: NeuronCheckSystem::Plugin

Defined in:
lib/neuroncheck/plugin.rb

Defined Under Namespace

Classes: Keyword, KeywordAPI

Constant Summary collapse

KEYWORD_CLASSES =

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

{}

Class Method Summary collapse

Class Method Details

.__define_keyword_method_to_module(name, keyword_class) ⇒ Object

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



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 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) ⇒ Object

キーワードの追加



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 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) ⇒ Object

キーワードの別名を定義



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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) ⇒ Object

キーワードの削除



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 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