def values(self,
               columns=None,
               recurse=True,
               flags=0,
               mapper=None,
               key='name',
               **get_options):
        """
        Returns a dictionary grouping the columns and their
        current values.  If the inflated value is set to True,
        then you will receive any foreign keys as inflated classes (if you
        have any values that are already inflated in your class, then you
        will still get back the class and not the primary key value).  Setting
        the mapper option will map the value by calling the mapper method.

        :param      useFieldNames | <bool>
                    inflated | <bool>
                    mapper | <callable> || None

        :return     { <str> key: <variant>, .. }
        """
        output = {}
        schema = self.schema()

        for column in columns or schema.columns(recurse=recurse, flags=flags).values():
            column = column if isinstance(column, orb.Column) else schema.column(column)
            try:
                val_key = column if key == 'column' else getattr(column, key)()
            except AttributeError:
                raise errors.OrbError(
                    'Invalid key used in data collection.  Must be name, field, or column.'
                )
            else:
                value = self.get(column, **get_options)
                output[val_key] = mapper(value) if mapper else value

        return output