pro mg_use, routines, outdir, class=class
  compile_opt strictarr
  
  resolve_routine, routines, /either
  resolve_all, class=class
  resolve_all
  
  
  procedures = routine_info(/source)
  functions = routine_info(/source, /functions)
  nprocedures = size(procedures, /type) eq 7L ? 0: n_elements(procedures)
  nfunctions = size(functions, /type) eq 7L ? 0: n_elements(functions)
  
  
  if (nprocedures gt 1L) then procedures = procedures[1:*]
  nprocedures--
  
  
  case 1 of
    nprocedures gt 0L && nfunctions gt 0L: filenames = [procedures.path, functions.path]
    nprocedures gt 0L && nfunctions eq 0L: filenames = procedures.path
    nprocedures eq 0L && nfunctions gt 0L: filenames = functions.path
    nprocedures eq 0L && nfunctions eq 0L: return
  endcase
    
  
  libdir = filepath('lib')
  libfiles = where(strpos(filenames, libdir) eq 0L, nlibfiles)
  if (nlibfiles gt 0L) then begin
    all = bytarr(n_elements(filenames))
    all[libfiles] = 1B
    
    nonlibfiles = where(all eq 0B, nnonlibfiles)
    if (nnonlibfiles gt 0L) then begin
      filenames = filenames[nonlibfiles]
    endif else return
  endif
  
  uniqElements = uniq(filenames, sort(filenames))
  filenames = filenames[uniqElements]  
  
  
  if (n_elements(filenames) eq 1L) then return
  filenames = filenames[where(file_basename(filenames) ne 'mg_use.pro')]
  
  
  validInd = where(file_basename(filenames) ne 'mg_use_wrapper.pro', nvalid)
  if (nvalid gt 0L) then filenames = filenames[validInd] else return
    
  
  if (n_elements(outdir) eq 0L) then begin
    print, n_elements(filenames) eq 1L ? filenames : transpose(filenames)
  endif else begin
    if (~file_test(outdir, /directory)) then file_mkdir, outdir
    file_copy, filenames, outdir, /allow_same, /overwrite
  endelse
end