    /*
     *  call-seq:
     *     MultiSearcher.new(searcher*) -> searcher
     *
     *  Create a new MultiSearcher by passing a list of subsearchers to the
     *  constructor.
     */
    static VALUE
    frt_ms_init(int argc, VALUE *argv, VALUE self)
    {
        int i, j, top = 0, capa = argc;

        VALUE rsearcher;
        Searcher **searchers = ALLOC_N(Searcher *, capa);
        Searcher *s;

        for (i = 0; i < argc; i++) {
            rsearcher = argv[i];
            switch (TYPE(rsearcher)) {
                case T_ARRAY:
                    capa += RARRAY(rsearcher)->len;
                    REALLOC_N(searchers, Searcher *, capa);
                    for (j = 0; j < RARRAY(rsearcher)->len; j++) {
                        VALUE rs = RARRAY(rsearcher)->ptr[j];
                        Data_Get_Struct(rs, Searcher, s);
                        searchers[top++] = s;
                    }
                    break;
                case T_DATA:
                    Data_Get_Struct(rsearcher, Searcher, s);
                    searchers[top++] = s;
                    break;
                default:
                    rb_raise(rb_eArgError, "Can't add class %s to MultiSearcher",
                             rb_obj_classname(rsearcher));
                    break;
            }
        }
        s = msea_new(searchers, top, false);
        Frt_Wrap_Struct(self, &frt_ms_mark, &frt_ms_free, s);
        object_add(s, self);
        return self;
    }