Makes sense. This is what I think we could do to support this
1. Create a static method in Main that takes in 1 argument, InputStream and returns a SequenceInputStream which is a composite stream comprised of default file, say ".pigbootup" and the InputStream
2. All individual components within Main call this function to get a handle on the composite stream by passing it the InputStream it uses (Console, FileInput)
3. This composite stream is then passed to Grunt.
Another approach would be to add a new constructor to class Grunt, Grunt(InputStream in, PigContext pig). This constructor will create a composite stream (.pigbootup + console/fileinput), then create a BufferedReader on the composite stream and invoke Grunt(BufferedReader in, PigContext pig)
Not sure which one of these approach' would be better.
Any suggestions or other ideas?