   constructor: (@strata, @object, @fields, initial, subsequent, swap, penultimate, @callback) ->
     @levels = []
     @decisions = { initial, subsequent, swap, penultimate }
+    @exclusive = false
 
 class Level
   # Construct a new level. The `exclusive` pararameter determines how this level

  constructor: (@exclusive) ->
    @operations = []
    @locks = []
  lock: (strata, mutation, tier, callback) ->
    locks = (strata.locks[tier.address] or= [ [] ])
    if @exclusive
      throw new Error "already locked" if @locks.length
      lock = [ callback, strata, mutation ]
      lock.address = tier.address
      @locks.push lock
      locks.push [ lock ]
      locks.push []
      if locks[0].length is 0
        locks.shift()
        callback.call strata, mutation
    else
      lock = [ callback, strata, mutation ]
      lock.address = tier.address
      @locks.push lock
      locks[locks.length - 1].push lock
      if locks.length is 1
        callback.call strata, mutation

  # Remove the lock callback from the callback list..
  release: (strata) ->


    address

  load: (strata, mutation, address, callback) ->
    callback.apply strata, [ mutation, @tiers[address] ]

  dirty: ->

