split most per-lock operations out into the lock class