   constructor: (@exclusive) ->
     @operations = []
     @locks = []
+
   lock: (strata, mutation, address, callback) ->
     # TODO Will it matter if we load before we lock? We probably have to.
     strata.io.load strata, mutation, address, (mutation, tier) =>

    @io             = options.io          or new module.exports.InMemory
    @_initialize(options.rootAddress)

  _initialize: (@rootAddress) ->
    if not @rootAddress
      @rootAddress = @io.allocate false, true, @innerSize
      # TODO: Rethink construction API.
      @io.load @, @rootAddress, @_createRoot

  _createRoot: (root) ->
    root.push { pivot: null, address: @io.allocate true, false, @leafSize }


  # If the root is full, we add a root split operation to the operation stack.
  _shouldDrainRoot: (mutation) ->
    if @innerSize is mutation.child.tier.size()
      mutation.plan[0].operations.push "splitRoot"
    console.log "_shouldDrainRoot"

  # Shorthand to allocate a new inner tier.
  _newInnerTier: (mutation, penultimate) ->
