/**
* Performs a double-checked locking pattern.
*
* Call {@link DoubleCheckedLocking::then()} on the returned object.
*
* Example:
* <code>
* $mutex->check(function () use ($bankAccount, $amount) {
* return $bankAccount->getBalance() >= $amount;
*
* })->then(function () use ($bankAccount, $amount) {
* $bankAccount->withdraw($amount);
* });
* </code>
*
* @return DoubleCheckedLocking The double-checked locking pattern.
*/
public function check(callable $check)
{
$doubleCheckedLocking = new DoubleCheckedLocking($this);
$doubleCheckedLocking->setCheck($check);
return $doubleCheckedLocking;
}