code: def pack(self, value=None):
          r
          if isinstance(value, type(self)):
              return value.pack()
  
          if value is None:
              value = self.value
          elif 'value' in dir(value):
              # if it is enum or bitmask gets only the 'int' value
              value = value.value
  
          try:
              return struct.pack(self._fmt, value)
          except struct.error:
              expected_type = type(self).__name__
              actual_type = type(value).__name__
              msg_args = expected_type, value, actual_type
              msg = 'Expected {}, found value "{}" of type {}'.format(*msg_args)
              raise PackException(msg)
docs: r"""Pack the value as a binary representation.
  
          Considering an example with UBInt8 class, that inherits from
          GenericType:
  
          >>> from pyof.foundation.basic_types import UBInt8
          >>> objectA = UBInt8(1)
          >>> objectB = 5
          >>> objectA.pack()
          b'\x01'
          >>> objectA.pack(objectB)
          b'\x05'
  
          Args:
              value: If the value is None, then we will pack the value of the
                  current instance. Otherwise, if value is an instance of the
                  same type as the current instance, then we call the pack of the
                  value object. Otherwise, we will use the current instance pack
                  method on the passed value.
  
          Returns:
              bytes: The binary representation.
  
          Raises:
              :exc:`~.exceptions.BadValueException`: If the value does not
                  fit the binary format.