/** * Creates a concurrency lock on the domain object, with an optional * closure to execute if the object has changed in the db when the lock * finally provided. Closure gets the original and the new object * @chainable */ public function lock($onChanged = null) { $lock = new Locking\PessimisticLock($this); $locked = $lock->acquire(); if (is_callable($onChanged) && !$locked->equals($this)) { call_user_func($onChanged, $this, $locked); } // reload data from locked $this->_data = $locked->_data; return $this; }