txt: ## argfiles.md
  class IO::ArgFiles
  
  Iterate over contents of files specified on command line
  
  ```raku
  class IO::ArgFiles is IO::CatHandle { }
  ```
  
  This class exists for backwards compatibility reasons and provides no additional methods to [`IO::CatHandle`](/type/IO/CatHandle), so it can be used in the same way as it, for instance, in this way:
  
  ```raku
  my $argfiles = IO::ArgFiles.new(@*ARGS);
  .say for $argfiles.lines;
  
  ```
  
  If invoked with `raku io-argfiles.raku *.raku` it will print the contents of all the files with that extension in the directory. However, that is totally equivalent to:
  
  ```raku
  my $argfiles = IO::CatHandle.new(@*ARGS);
  .say for $argfiles.lines;
  
  ```
  
  # [Variables](#class_IO::ArgFiles "go to top of document")[§](#Variables "direct link")
  
  ## [`$*ARGFILES`](#class_IO::ArgFiles "go to top of document")[§](#$*ARGFILES "direct link")
  
  This class is the magic behind the `$*ARGFILES` variable, which provides a way to iterate over files passed in to the program on the command line (i.e. elements of [`@*ARGS`](/language/variables#index-entry-%40%2AARGS)). Thus the examples above can be simplified like so:
  
  ```raku
  .say for $*ARGFILES.lines;
  
  # or
  while ! $*ARGFILES.eof {
      say $*ARGFILES.get;
  }
  
  # or
  say $*ARGFILES.slurp;
  ```
  
  Save one of the variations above in a file, say `argfiles.raku`. Then create another file (named, say `sonnet18.txt` with the contents:
  
  ｢text｣ without highlighting
  
  ```
  
  
  ```
  
  Shall I compare thee to a summer's day?
  
  
  ```
  
  
  ```
  
  Running the command
  
  ｢text｣ without highlighting
  
  ```
  
  
  ```
  
  $ raku argfiles.raku sonnet18.txt
  
  
  ```
  
  
  ```
  
  will then give the output
  
  ｢text｣ without highlighting
  
  ```
  
  
  ```
  
  Shall I compare thee to a summer's day?
  
  
  ```
  
  
  ```
  
  As of 6.d language, `$*ARGFILES` *inside* [`sub MAIN`](/language/functions#sub_MAIN) is always set to `$*IN`, even when `@*ARGS` is not empty. That means that
  
  ```raku
  sub MAIN () {
      .say for $*ARGFILES.lines;
  }
  
  ```
  
  which can be used as `cat *.raku | raku argfiles-main.raku`, for instance, is totally equivalent to:
  
  ```raku
  sub MAIN () {
      .say for $*IN.lines;
  }
  
  ```
  
  and, in fact, can't be used to process the arguments in the command line, since, in this case, it would result in a usage error.
  
  Bear in mind that the object `$*ARGFILES` is going to contain a handle for every argument in a command line, even if that argument is not a valid file. You can retrieve them via the `.handles` method.
  
  ```raku
  for $*ARGFILES.handles -> $fh {
      say $fh;
  }
  
  ```
  
  That code will fail if any of the arguments is not the valid name of a file. You will have to deal with that case at another level, checking that [`@*ARGS`](/language/variables#index-entry-%40*ARGS) contains valid file names, for instance.
  