text: from ...utils import docval, getargs
  from ...build import ObjectMapper, BuildManager
  from ...spec import Spec
  from ..table import DynamicTable, VectorIndex
  from .. import register_map
  
  
  @register_map(DynamicTable)
  class DynamicTableMap(ObjectMapper):
  
      def __init__(self, spec):
          super().__init__(spec)
          vector_data_spec = spec.get_data_type('VectorData')
          self.map_spec('columns', vector_data_spec)
  
      @ObjectMapper.object_attr('colnames')
      def attr_columns(self, container, manager):
          if all(not col for col in container.columns):
              return tuple()
          return container.colnames
  
      @docval({"name": "spec", "type": Spec, "doc": "the spec to get the attribute value for"},
              {"name": "container", "type": DynamicTable, "doc": "the container to get the attribute value from"},
              {"name": "manager", "type": BuildManager, "doc": "the BuildManager used for managing this build"},
              returns='the value of the attribute')
      def get_attr_value(self, **kwargs):
          ''' Get the value of the attribute corresponding to this spec from the given container '''
          spec, container, manager = getargs('spec', 'container', 'manager', kwargs)
          attr_value = super().get_attr_value(spec, container, manager)
          if attr_value is None and spec.name in container:
              if spec.data_type_inc == 'VectorData':
                  attr_value = container[spec.name]
                  if isinstance(attr_value, VectorIndex):
                      attr_value = attr_value.target
              elif spec.data_type_inc == 'DynamicTableRegion':
                  attr_value = container[spec.name]
                  if isinstance(attr_value, VectorIndex):
                      attr_value = attr_value.target
                  if attr_value.table is None:
                      msg = "empty or missing table for DynamicTableRegion '%s' in DynamicTable '%s'" %\
                            (attr_value.name, container.name)
                      raise ValueError(msg)
              elif spec.data_type_inc == 'VectorIndex':
                  attr_value = container[spec.name]
          return attr_value
  