   }
     
   /// Create a Value object from an llb_data_t.
-  private static func fromInternalData(_ data: llb_data_t) -> Value {
+  fileprivate static func fromInternalData(_ data: llb_data_t) -> Value {
     return Value([UInt8](UnsafeBufferPointer(start: data.data, count: Int(data.length))))
   }
 
   /// Provide a Value contents as an llb_data_t pointer.
-  private func withInternalDataPtr<T>(closure: @noescape (UnsafePointer<llb_data_t>) -> T) -> T {
+  fileprivate func withInternalDataPtr<T>(closure: @noescape (UnsafePointer<llb_data_t>) -> T) -> T {
     return data.withUnsafeBufferPointer { (dataPtr: UnsafeBufferPointer<UInt8>) -> T in
         var value = llb_data_t(length: UInt64(self.data.count), data: dataPtr.baseAddress)
         return withUnsafePointer(&value, closure)

  /// MARK: Internal Delegate Implementation

  /// Helper function for getting the engine from the delegate context.
  static private func toEngine(_ context: UnsafeMutablePointer<Void>) -> BuildEngine {
    return Unmanaged<BuildEngine>.fromOpaque(unsafeBitCast(context, to: OpaquePointer.self)).takeUnretainedValue()
  }

  /// Helper function for getting the rule from a rule delegate context.
  static private func toRule(_ context: UnsafeMutablePointer<Void>) -> Rule {
    return Unmanaged<Wrapper<Rule>>.fromOpaque(unsafeBitCast(context, to: OpaquePointer.self)).takeUnretainedValue().item
  }

  /// Helper function for getting the task from a task delegate context.
  static private func toTaskWrapper(_ context: UnsafeMutablePointer<Void>) -> TaskWrapper {
    return Unmanaged<TaskWrapper>.fromOpaque(unsafeBitCast(context, to: OpaquePointer.self)).takeUnretainedValue()
  }
  
  private func lookupRule(_ key: UnsafePointer<llb_data_t>, _ ruleOut: UnsafeMutablePointer<llb_rule_t>) {
    numRules += 1
    
    // Get the rule from the client.

  }

  /// Create a Key object from an llb_data_t.
  fileprivate static func fromInternalData(_ data: llb_data_t) -> Key {
    return Key([UInt8](UnsafeBufferPointer(start: data.data, count: Int(data.length))))
  }

  /// Provide a Key contents as an llb_data_t pointer.
  fileprivate func withInternalDataPtr<T>(closure: @noescape (UnsafePointer<llb_data_t>) -> T) -> T {
    return data.withUnsafeBufferPointer { (dataPtr: UnsafeBufferPointer<UInt8>) -> T in
        var value = llb_data_t(length: UInt64(self.data.count), data: dataPtr.baseAddress)
        return withUnsafePointer(&value, closure)
