package com.gsamokovarov.skiptrace;

import org.jruby.runtime.ThreadContext; import org.jruby.runtime.Binding; import org.jruby.runtime.DynamicScope; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.RubyBinding; import org.jruby.RubyArray; import org.jruby.Ruby; import java.util.Iterator;

public class RubyBindingsCollector {

private final Ruby runtime;
private Iterator<Binding> iterator;

public static RubyArray collectCurrentFor(ThreadContext context) {
    return new RubyBindingsCollector(context).collectCurrent();
}

private RubyBindingsCollector(ThreadContext context) {
    this.iterator = new CurrentBindingsIterator(context);
    this.runtime = context.getRuntime();
}

private RubyArray collectCurrent() {
    RubyArray bindings = RubyArray.newArray(runtime);

    while (iterator.hasNext()) {
        bindings.append(((IRubyObject) RubyBinding.newBinding(runtime, iterator.next())));
    }

    return bindings;
}

}