def check_connect(self, src, dest, scope):
        """Check validity of connecting a source expression to a destination
        expression, and determine if we need to create links to pseudocomps.
        """

        if self.get_source(dest) is not None:
            scope.raise_exception(
                "'%s' is already connected to source '%s'" %
                (dest, self.get_source(dest)), RuntimeError)

        destexpr = ConnectedExprEvaluator(dest, scope, is_dest=True)
        srcexpr = ConnectedExprEvaluator(src, scope, getter='get_attr_w_copy')

        srccomps = srcexpr.get_referenced_compnames()
        destcomps = list(destexpr.get_referenced_compnames())

        if destcomps and destcomps[0] in srccomps:
            raise RuntimeError("'%s' and '%s' refer to the same component." %
                               (src, dest))

        try:
            return srcexpr, destexpr, self._needs_pseudo(srcexpr, destexpr)
        except AttributeError as err:
            exc_type, value, traceback = sys.exc_info()

            invalid_vars = srcexpr.get_unresolved() + destexpr.get_unresolved()
            parts = invalid_vars[0].rsplit('.', 1)

            parent = repr(scope.name) if scope.name else 'top level assembly'
            vname = repr(parts[0])

            if len(parts) > 1:
                parent = repr(parts[0])
                vname = repr(parts[1])

            msg = "{parent} has no variable {vname}"
            msg = msg.format(parent=parent, vname=vname)

            raise AttributeError, AttributeError(msg), traceback