def __neuron_check_method_added_hook(target_cls_or_mod, method_name, met, singleton_original_class = nil)
      singleton = !(singleton_original_class.nil?)

      # メソッド定義時のフックが無効化されている場合は何もしない
      return unless @__neuron_check_method_added_hook_enabled

      # 直前にNeuronCheck宣言部があれば、その宣言内容を登録する
      if (declaration = @__neuron_check_last_declaration) then

        # あらかじめ登録と、メソッドやクラスとの紐付けを行っておく
        # この処理を先に行わないと正しく名前を取得できない
        NeuronCheckSystem::METHOD_DECLARATIONS[target_cls_or_mod][method_name] = declaration
        declaration.assigned_class_or_module = target_cls_or_mod
        declaration.assigned_method = met
        declaration.assigned_singleton_original_class = singleton_original_class


        # 宣言に引数チェックが含まれている場合、宣言部の引数の数が、実際のメソッドの引数の数を超えていないかをチェック
        # 超えていれば宣言エラーとする
        if declaration.arg_matchers.size > met.parameters.size then
          raise NeuronCheckSystem::DeclarationError, "given arguments number of ##{method_name} greater than method definition - expected #{met.parameters.size} args, but #{declaration.arg_matchers.size} args were declared"
        end

        # パラメータの中にブロック型の引数が含まれているが
        # そのパラメータが、anyでもblockでもない型である場合はエラー
        met.parameters.each_with_index do |param_info, def_param_index|
          param_type, param_name = param_info
          if param_type == :block and (matcher = declaration.arg_matchers[def_param_index]) then
            next if matcher.respond_to?(:keyword_name) and matcher.keyword_name == 'any'
            next if matcher.respond_to?(:keyword_name) and matcher.keyword_name == 'block'

            context_caption = "#{NeuronCheckSystem::Utils.ordinalize(def_param_index + 1)} argument `#{param_name}' of `#{declaration.signature_caption_name_only}'"
            raise NeuronCheckSystem::DeclarationError, "#{context_caption} is block argument - it can be specified only keyword `any' or `block'"
          end
        end

        # 特異メソッドでなく、メソッド名が「initialize」であるにもかかわらず、returns宣言が含まれている場合はエラー
        if not singleton and method_name == :initialize and declaration.return_matcher then
          raise NeuronCheckSystem::DeclarationError, "returns declaration cannot be used with `#initialize' method"
        end

        # チェック処理の追加が完了したら、「最後に宣言した内容」を表すクラスインスタンス変数をnilに戻す
        @__neuron_check_last_declaration = nil
      end
    end
def __neuron_check_method_added_hook(target_cls_or_mod, method_name, met, singleton_original_class = nil)
      singleton = !(singleton_original_class.nil?)

      # メソッド定義時のフックが無効化されている場合は何もしない
      return unless @__neuron_check_method_added_hook_enabled

      # 直前にNeuronCheck宣言部があれば、その宣言内容を登録する
      if (declaration = @__neuron_check_last_declaration) then

        # あらかじめ登録と、メソッドやクラスとの紐付けを行っておく
        # この処理を先に行わないと正しく名前を取得できない
        NeuronCheckSystem::METHOD_DECLARATIONS[target_cls_or_mod][method_name] = declaration
        declaration.assigned_class_or_module = target_cls_or_mod
        declaration.assigned_method = met
        declaration.assigned_singleton_original_class = singleton_original_class


        # 宣言に引数チェックが含まれている場合、宣言部の引数の数が、実際のメソッドの引数の数を超えていないかをチェック
        # 超えていれば宣言エラーとする
        if declaration.arg_matchers.size > met.parameters.size then
          raise NeuronCheckSystem::DeclarationError, "given arguments number of ##{method_name} greater than method definition - expected #{met.parameters.size} args, but #{declaration.arg_matchers.size} args were declared"
        end

        # パラメータの中にブロック型の引数が含まれているが
        # そのパラメータが、anyでもblockでもない型である場合はエラー
        met.parameters.each_with_index do |param_info, def_param_index|
          param_type, param_name = param_info
          if param_type == :block and (matcher = declaration.arg_matchers[def_param_index]) then
            next if matcher.respond_to?(:keyword_name) and matcher.keyword_name == 'any'
            next if matcher.respond_to?(:keyword_name) and matcher.keyword_name == 'block'

            context_caption = "#{NeuronCheckSystem::Utils.ordinalize(def_param_index + 1)} argument `#{param_name}' of `#{declaration.signature_caption_name_only}'"
            raise NeuronCheckSystem::DeclarationError, "#{context_caption} is block argument - it can be specified only keyword `any' or `block'"
          end
        end

        # 特異メソッドでなく、メソッド名が「initialize」であるにもかかわらず、returns宣言が含まれている場合はエラー
        if not singleton and method_name == :initialize and declaration.return_matcher then
          raise NeuronCheckSystem::DeclarationError, "returns declaration cannot be used with `#initialize' method"
        end

        # チェック処理の追加が完了したら、「最後に宣言した内容」を表すクラスインスタンス変数をnilに戻す
        @__neuron_check_last_declaration = nil
      end
    end
メソッド/特異メソッドを定義したときの共通処理