Create a new class with the given index classes

        Parameters
        -----------
        index_classes: list
            The list of index classes to be used in the multi-index class to create
        name: str
            The name of the new multi-index class. If not set, it will be the same
            as the current class
        key: str
            A key to augment the default key of each index, to avoid collision.
        transform: callable
            None by default, can be set to a function that will transform the value to be indexed.
            This callable can accept one (`value`) or two (`self`, `value`) arguments

def compose(cls, index_classes, key=None, transform=None, name=None):
        """Create a new class with the given index classes

        Parameters
        -----------
        index_classes: list
            The list of index classes to be used in the multi-index class to create
        name: str
            The name of the new multi-index class. If not set, it will be the same
            as the current class
        key: str
            A key to augment the default key of each index, to avoid collision.
        transform: callable
            None by default, can be set to a function that will transform the value to be indexed.
            This callable can accept one (`value`) or two (`self`, `value`) arguments

        """

        attrs = {}
        if index_classes:
            attrs['index_classes'] = index_classes

        klass = type(str(name or cls.__name__), (cls, ), attrs)

        # let the ``configure`` method manage some fields
        configure_attrs = {}
        if key is not None:
            configure_attrs['key'] = key
        if transform is not None:
            configure_attrs['transform'] = transform

        if configure_attrs:
            klass = klass.configure(**configure_attrs)

        return klass