@classmethod
def from_items(cls, items, orientation, spacing):
    """ A classmethod that generates a list of abutment constraints
        given a sequence of items, an orientation, and default spacing.

        Parameters
        ----------
        items : sequence
            A valid sequence of constrainable objects. These inclue
            instances of Constrainable, LinearSymbolic, Spacer,
            and int.

        orientation : string
            Either 'vertical' or 'horizontal', which represents the
            orientation in which to abut the items.

        spacing : int
            The spacing to use between items if no spacing is explicitly
            provided by in the sequence of items.

        Returns
        -------
        result : list
            A list of AbutmentConstraint instances.

        Notes
        ------
        The order of abutment is left-to-right for horizontal direction
        and top-to-bottom for vertical direction.

        """
    orient = cls.orientation_map.get(orientation)
    if orient is None:
        msg = (
            "Valid orientations for abutment are 'vertical' or 'horizontal'. Got %r instead."
            )
        raise ValueError(msg % orientation)
    first_name, second_name = orient
    if orientation == 'vertical':
        items.reverse()
    return cls._make_cns(items, first_name, second_name, spacing)
