def apply()

in nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala [83:154]


        def apply(cfg: NCModelConfig, intent: NCIDLIntent, obj: AnyRef, mtd: Method): IntentHolder =
            new IntentHolder(intent, prepareCallback(cfg, mtd, obj, intent), mtd)

    /**
      *
      * @param iter
      */
    private def col2Str(iter: Iterable[_]): String = iter.mkString("(", ",", ")")

    /**
      *
      * @param clazz
      */
    private def class2Str(clazz: Class[_]): String =
        val cls = clazz.getSimpleName.strip
        // Anonymous classes (like `class foo.bar.name$1`) doesn't have simple names.
        if cls.nonEmpty then cls else clazz.getName.reverse.takeWhile(_ != '.').reverse

    /**
      *
      * @param mtd
      */
    private def method2Str(mtd: Method): String =
        val cls = class2Str(mtd.getDeclaringClass)
        val name = mtd.getName
        val args = mtd.getParameters.map(_.getType.getSimpleName).mkString(", ")
        s"$cls#$name($args)"

    /**
      *
      * @param f
      */
    private def field2Str(f: Field): String =
        val cls = class2Str(f.getDeclaringClass)
        val name = f.getName
        s"$cls.$name"

    /**
      *
      * @param cfg
      * @param mtd
      * @param prmClss
      * @param argsList
      */
    private def prepareParams(cfg: NCModelConfig, mtd: Method, prmClss: List[Class[_]], argsList: List[List[NCEntity]]): Seq[AnyRef] =
        prmClss.zip(argsList).zipWithIndex.map { case ((paramCls, argList), i) =>
            def mkArg(): String = arg2Str(mtd, i)

            lazy val z = s"mdlId=${cfg.getId}, type=$paramCls, arg=${mkArg()}"
            val entsCnt = argList.size

            // Single entity.
            if paramCls == CLS_ENTITY then
                if entsCnt != 1 then E(s"Expected single entity (found $entsCnt) in $IT annotated argument [$z]")

                argList.head
            // Array of entities.
            else if paramCls.isArray then
                argList.toArray
            else if paramCls == CLS_SCALA_SEQ then
                argList
            else if paramCls == CLS_SCALA_LST then
                argList
            else if paramCls == CLS_SCALA_OPT then
                entsCnt match
                    case 0 => None
                    case 1 => argList.head.?
                    case _ => E(s"Too many entities ($entsCnt) for 'scala.Option[_]' $IT annotated argument [$z]")
            else
                // All allowed arguments types already checked.
                throw new AssertionError(s"Unexpected type for callback's $IT argument [$z]")
        }