       throw new Error "Macro #{name} already defined"
     else
       addToMap topScope.macros, name, macro
-  for name, {type, arity, docs, source, isClass, virtual, final} of values definitions when shouldImport name
-    addToMap topScope, name, {type, arity, docs, source, isClass, virtual, final}
+  for name, {type, arity, docs, source, isClass, virtual, final} of values definitions when (shouldImport name) and final
+    addToMap topScope, name, {type, arity, docs, source, isClass, virtual, final: shouldDeclare}
   topScope.typeNames = concatMaps topScope.typeNames, typeNames
   topScope.classes = concatMaps topScope.classes, classes
   ctx.scopeIndex += compiledModule.savedScopes.length

  if (not isTuple reqTuple) or _empty reqs
    return malformed ctx, reqTuple, 'req requires a tuple of names to be required'
  map (syntaxNewName ctx, 'definition name to be imported required'), reqs
  [moduleName] = _validArguments call
  if not moduleName or not isName moduleName
    return malformed ctx, call, 'req requires a module name to require from'
  moduleName.label = 'param'
  requiredNames = (arrayToSet (filter _is, (map _symbol, reqs)))
  ctx.req moduleName.symbol, requiredNames
  imports moduleName.symbol, setToArray requiredNames

imports = (moduleName, names) ->
  validModuleName = validIdentifier moduleName


  req: (moduleName, names) ->
    addToMap @_requested, moduleName, names
    if not @isModuleLoaded moduleName
      @_requesting = yes

  isModuleLoaded: (moduleName) ->
    inSet @importedModules, moduleName

  requested: ->
    if @_requested.size > 0
