/*
 *  call-seq:
 *     Sort.new(sort_fields = [SortField::SCORE, SortField::DOC_ID], reverse = false) -> Sort
 *
 *  Create a new Sort object. If +reverse+ is true, all sort_fields will be
 *  reversed so if any of them are already reversed the  will be turned back
 *  to their natural order again. By default 
 */
static VALUE
frt_sort_init(int argc, VALUE *argv, VALUE self)
{
    int i;
    VALUE rfields, rreverse;
    bool reverse = false;
    bool has_sfd = false;
    GET_SORT();
    switch (rb_scan_args(argc, argv, "02", &rfields, &rreverse)) {
        case 2: reverse = RTEST(rreverse);
        case 1: 
                if (TYPE(rfields) == T_ARRAY) {
                    int i;
                    for (i = 0; i < RARRAY(rfields)->len; i++) {
                        frt_sort_add(sort, RARRAY(rfields)->ptr[i], reverse);
                    }
                } else {
                    frt_sort_add(sort, rfields, reverse);
                }
                for (i = 0; i < sort->size; i++) {
                    if (sort->sort_fields[i] == &SORT_FIELD_DOC) has_sfd = true;
                }
                if (!has_sfd) {
                    sort_add_sort_field(sort, (SortField *)&SORT_FIELD_DOC);
                }
                break;
        case 0:
                sort_add_sort_field(sort, (SortField *)&SORT_FIELD_SCORE);
                sort_add_sort_field(sort, (SortField *)&SORT_FIELD_DOC);
    }
    rfields = rb_ary_new2(sort->size);
    for (i = 0; i < sort->size; i++) {
        rb_ary_store(rfields, i, object_get(sort->sort_fields[i]));
    }
    object_add(sort->sort_fields, rfields);

    return self;
}