# File lib/sfl.rb, line 98
    def option_parser(hash)
      result = []

      # changing dir has high priority
      chdir = hash.delete(:chdir)
      if chdir
        result[0] = [Dir, :chdir, chdir]
      end

      # other options 
      result += hash.map {|k, v|
        case k
        when :in, :out, :err
          if right = redirection_ast(v, k)
            [[REDIRECTION_MAPPING[k], :reopen, right]]    
          else
            [[REDIRECTION_MAPPING[k], :close]]    
          end
        when Array
          # assuming k is like [:out, :err]
          raise NotImplementedError if k.size > 2
          left1, left2 = *k.map {|i| REDIRECTION_MAPPING[i] }
          if right = redirection_ast(v)
            [
              [left1, :reopen, right],
              [left2, :reopen, left1],
            ]
          else
            [
              [left1, :close],
              [left2, :close],
            ]
          end
        end
      }.flatten(1)
      result
    end