def with_classical_controls(
        self, *conditions: str | cirq.MeasurementKey | cirq.Condition | sympy.Expr
    ) -> cirq.Operation:
        """Returns a classically controlled version of this operation.

        An operation that is classically controlled is executed iff all
        conditions evaluate to True. Conditions can be either a measurement key
        or a user-specified `cirq.Condition`. A measurement key evaluates to
        True iff any qubit in the corresponding measurement operation evaluated
        to a non-zero value; `cirq.Condition` supports more complex,
        user-defined conditions.

        If no conditions are specified, returns self.

        The classical control will remove any tags on the existing operation,
        since tags are fragile, and we always opt to get rid of the tags when
        the underlying operation is changed.

        Args:
            *conditions: A list of measurement keys, strings that can be parsed
                into measurement keys, or sympy expressions where the free
                symbols are measurement key strings.

        Returns:
            A `ClassicallyControlledOperation` wrapping the operation. If no conditions
           are specified, returns self.
        """
        from cirq.ops.classically_controlled_operation import ClassicallyControlledOperation

        if not conditions:
            return self
        return ClassicallyControlledOperation(self, conditions)
Returns a classically controlled version of this operation.

        An operation that is classically controlled is executed iff all
        conditions evaluate to True. Conditions can be either a measurement key
        or a user-specified `cirq.Condition`. A measurement key evaluates to
        True iff any qubit in the corresponding measurement operation evaluated
        to a non-zero value; `cirq.Condition` supports more complex,
        user-defined conditions.

        If no conditions are specified, returns self.

        The classical control will remove any tags on the existing operation,
        since tags are fragile, and we always opt to get rid of the tags when
        the underlying operation is changed.

        Args:
            *conditions: A list of measurement keys, strings that can be parsed
                into measurement keys, or sympy expressions where the free
                symbols are measurement key strings.

        Returns:
            A `ClassicallyControlledOperation` wrapping the operation. If no conditions
           are specified, returns self.
        
cirq-core/cirq/ops/raw_types.py