class_docstr: A metaclass used to auto-fill union classes for FBLearner.
  It automatically keeps track of all the subclasses and uses them to fill the union
      class (by calling the fill_union() method).
  After a union class is filled, the registry gets frozen and new members can't be added.
  If environment variable SKIP_FROZEN_REGISTRY_CHECK=1 is set, we log a warning instead of
      raising an exception when a new member is attempted to be added to the registry.
code: def __init__(cls, name, bases, attrs):
      if not hasattr(cls, "REGISTRY"):
          # Put REGISTRY on cls. This only happens once on the base class
          logger.debug("Adding REGISTRY to type {}".format(name))
          cls.REGISTRY: Dict[str, Type] = {}
          cls.REGISTRY_NAME = name
          cls.REGISTRY_FROZEN = False
  
      if cls.REGISTRY_FROZEN:
          # trying to add to a frozen registry
          if skip_frozen_registry_check():
              logger.warning(
                  f"{cls.REGISTRY_NAME} has been used to fill a union and is now frozen. "
                  "Since environment variable SKIP_FROZEN_REGISTRY_CHECK was set, "
                  f"no exception was raised, but {name} wasn't added to the registry"
              )
          else:
              raise RuntimeError(
                  f"{cls.REGISTRY_NAME} has been used to fill a union and is now frozen, "
                  f"so {name} can't be added to the registry. "
                  "Please rearrange your import orders. Or set environment variable "
                  "SKIP_FROZEN_REGISTRY_CHECK=1 to replace this error with a warning if you "
                  f"don't need the {name} to be added to the registry (e.g. if you're running the "
                  "code in an interactive mode or are developing custom FBL workflows that don't "
                  "rely on ReAgent union classes)"
              )
      else:
          if not cls.__abstractmethods__ and name != cls.REGISTRY_NAME:
              # Only register fully-defined classes
              logger.debug(f"Registering {name} to {cls.REGISTRY_NAME}")
              if hasattr(cls, "__registry_name__"):
                  registry_name = cls.__registry_name__
                  logger.debug(
                      f"Using {registry_name} instead of {name}"
                  )
                  name = registry_name
              assert (
                  name not in cls.REGISTRY
              ), f"{name} in REGISTRY {cls.REGISTRY}"
              cls.REGISTRY[name] = cls
          else:
              logger.debug(
                  f"Not Registering {name} to {cls.REGISTRY_NAME}. Abstract "
                  f"methods {list(cls.__abstractmethods__)} are not implemented."
              )
      return super().__init__(name, bases, attrs)
  
file_path: ReAgent/reagent/core/registry_meta.py
imports: import abc
  import logging
  import os
  from typing import Dict, Optional, Type
  from reagent.core.dataclasses import dataclass
  from reagent.core.fb_checker import IS_FB_ENVIRONMENT
label_desc: Use image node_id 1 to create a new RegistryMeta object from inherited base classes: abc with example: obj = RegistryMeta(cls, name, bases, attrs)