code: def recurse_module( overall_record, index, shared, stop_types=STOP_TYPES, already_seen=None, min_size=0 ):
      
      for record in recurse( 
          overall_record, index, 
          stop_types=stop_types, 
          already_seen=already_seen, 
          type_group=True,
      ):
          # anything with a totsize we've already processed...
          if record.get('totsize') is not None:
              continue 
          rinfo = record 
          rinfo['module'] = overall_record.get('name',NON_MODULE_REFS )
          if not record['refs']:
              rinfo['rsize'] = 0
              rinfo['children'] = []
          else:
              # TODO: provide a flag to coalesce based on e.g. type at each level or throughout...
              rinfo['children'] = rinfo_children = list ( children( record, index, stop_types=stop_types ) )
              rinfo['rsize'] = sum([
                  (
                      child.get('totsize',0.0)/float(len(shared.get( child['address'], [])) or 1)
                  )
                  for child in rinfo_children
              ], 0.0 )
          rinfo['totsize'] = record['size'] + rinfo['rsize']
      
      return None
docs: Creates a has-a recursive-cost hierarchy
      
      Mutates objects in-place to produce a hierarchy of memory usage based on 
      reference-holding cost assignment