@classmethod
def align(cls, sequences, bin_path=None, matrix=None, gap_penalty=None):
    """
        Perform a multiple sequence alignment.
        
        This is a convenience function, that wraps the :class:`MSAApp`
        execution.
        
        Parameters
        ----------
        sequences : iterable object of Sequence
            The sequences to be aligned
        bin_path : str, optional
            Path of the MSA software binary. By default, the default path
            will be used.
        matrix : SubstitutionMatrix, optional
            A custom substitution matrix.
        gap_penalty : float or (tuple, dtype=int), optional
            If a float is provided, the value will be interpreted as
            general gap penalty.
            If a tuple is provided, an affine gap penalty is used.
            The first value in the tuple is the gap opening penalty,
            the second value is the gap extension penalty.
            The values need to be negative.
        
        Returns
        -------
        alignment : Alignment
            The global multiple sequence alignment.
        """
    if bin_path is None:
        app = cls(sequences, matrix=matrix)
    else:
        app = cls(sequences, bin_path, matrix=matrix)
    if gap_penalty is not None:
        app.set_gap_penalty(gap_penalty)
    app.start()
    app.join()
    return app.get_alignment()
