# File lib/Getopt/Declare.rb, line 600
    def code(*t)

      owner = t[0]
      mod   = t[1]


      code = "\n"
      flag = @flag
      clump = owner.clump
      i = 0
      nocase = (Getopt::Declare::_nocase() || @nocase ? 'i' : '')

      code << "          catch(:paramout) do\n"
      code += (!@repeatable) ? "            while !_FOUND_['" + name() + "']" :
                               "            while 1"
      if (flag && (clump==1 && flag !~ /\A[^a-z0-9]+[a-z0-9]\Z/i ||
                   (clump<3 && @args )))
        code << " && !_lastprefix"
      end

      code << '
              begin
                catch(:param) do
                  _pos = _nextpos if _args
                  _PUNCT_ = {}
              '

      if flag
        code << '
                  _args && _pos = gindex( _args, /\G(?:\s|\0)*' + 
          Regexp::quote(flag) + '/' + nocase + ", _pos) or throw(:paramout) 
                  unless @_errormsg
                    @_errormsg = %q|incorrect specification of '" + flag + "' parameter|
                  end
"
      elsif ( ScalarArg::stdtype(@args[0]['type'])||'') !~ /\%F/
        code << %q%\n                  throw(:paramout) if @_errormsg\n%
      end


      code << "\n                  _PARAM_ = '" + self.name() + "'\n"


      trailer = []
      i = argcount = @args.length()-1
      while i > 0
        trailer[i-1] = @args[i].trailer()
        trailer[i-1] = trailer[i] unless trailer[i-1]
        i -= 1
      end # while i



      if @args
        code << "\n"+'                  _args && _pos = gindex( _args, /\G'

        0.upto( argcount ) { |i|
          code << @args[i].ows(@args[i].matcher(trailer[i]))
        }

        code << '/x' + nocase + ", _pos ) or throw(:paramout)\n"
      end # if @args


      0.upto( argcount ) { |i|
        code << @args[i].code(i,mod)   #, $flag ????

      } 

      if flag
        mutexlist = owner.mutex[flag] ? 
        (  owner.mutex[flag].map {|i| "'#{i}'"} ).join(',') : ''

        code << "
                  if _invalid.has_key?('#{flag}')
                    @_errormsg = %q|parameter '#{flag}' not allowed with parameter '| + _invalid['#{flag}'] + %q|'|
                    throw(:paramout)
                  else
                    for i in [#{mutexlist}]
                        _invalid[i] = '#{flag}'
                    end
                  end  #if/then

"
      end



      for action in @actions
        #action.sub!( /(\s*\{)/, '\1 module '+mod )  # @TODO

        code << "\n                  " + action + "\n"
      end

      if (flag && @items==0)
        code << "\n                  @cache['#{flag}'] = '#{flag}'\n"
      end

      if @items > 1
        code << "                  @cache['#{self.name}'] = {} unless @cache['#{self.name}']\n"
      end

      for subarg in @args
        code << subarg.cachecode(self.name(),@items)
      end

      if flag =~ /\A([^a-z0-9]+)/i
        code << '                  _lastprefix = "'+ Regexp::quote("#$1") + '"' + "\n"
      else
        code << "                  _lastprefix = nil\n"
      end

      code << "
                  _FOUND_['"+ self.name() + "'] = 1
                  throw :arg if _pos > 0
                  _nextpos = _args.length()
                  throw :alldone
                end  # catch(:param)
              end  # begin
            end # while
          end # catch(:paramout)
"

      code
    end