'Produce a :class:`.Join` object, given two :class:`.FromClause`
expressions.
E.g.::
j = join(user_table, address_table, user_table.c.id == address_table.c.user_id)
stmt = select([user_table]).select_from(j)
would emit SQL along the lines of::
SELECT user.id, user.name FROM user
JOIN address ON user.id = address.user_id
Similar functionality is available given any :class:`.FromClause` object
(e.g. such as a :class:`.Table`) using the :meth:`.FromClause.join`
method.
:param left: The left side of the join.
:param right: the right side of the join; this is any :class:`.FromClause`
object such as a :class:`.Table` object, and may also be a selectable-compatible
object such as an ORM-mapped class.
:param onclause: a SQL expression representing the ON clause of the
join.  If left at ``None``, :meth:`.FromClause.join` will attempt to
join the two tables based on a foreign key relationship.
:param isouter: if True, render a LEFT OUTER JOIN, instead of JOIN.
.. seealso::
:meth:`.FromClause.join` - method form, based on a given left side
:class:`.Join` - the type of object produced'

@classmethod
def _create_join(cls, left, right, onclause=None, isouter=False):

    return cls(left, right, onclause, isouter)
