docs: def postprocess(self, calc, with_module=None, dry_run=None):
          '''
          Invokes module(s) API
          NB: this is the PUBLIC method
          @returns apps_dict
          '''
          for appname, appclass in self.Apps.items():
              if with_module and with_module != appname: continue
  
              run_permitted = False
  
              # scope-conditions
              if appclass['apptarget']:
                  for key in appclass['apptarget']:
                      negative = False
                      if str(appclass['apptarget'][key]).startswith('!'):
                          negative = True
                          scope_prop = appclass['apptarget'][key][1:]
                      else:
                          scope_prop = appclass['apptarget'][key]
  
                      if key in calc.info:
                          # non-strict comparison ("CRYSTAL" matches "CRYSTAL09 v2.0")
                          if (str(scope_prop) in str(calc.info[key]) or scope_prop == calc.info[key]) != negative: # true if only one, but not both
                              run_permitted = True
                          else:
                              run_permitted = False
                              break
  
              else: run_permitted = True
  
              # module code running
              if run_permitted:
                  calc.apps[appname] = {'error': None, 'data': None}
                  if dry_run:
                      continue
                  try:
                      AppInstance = appclass['appmodule'](calc)
                  except:
                      exc_type, exc_value, exc_tb = sys.exc_info()
                      errmsg = "Fatal error in %s module:\n %s" % ( appname, " ".join(traceback.format_exception( exc_type, exc_value, exc_tb )) )
                      calc.apps[appname]['error'] = errmsg
                      calc.warning( errmsg )
                  else:
                      try:
                          calc.apps[appname]['data'] = getattr(AppInstance, appclass['appdata'])
                      except AttributeError:
                          errmsg = 'No appdata-defined property found for %s module!' % appname
                          calc.apps[appname]['error'] = errmsg
                          calc.warning( errmsg )
          return calc