 public final class ContextToken: Hashable {
 
     public let context: Context
-    fileprivate weak var contextAware: ContextAware?
+    fileprivate weak var contextNode: ContextNode?
 
     fileprivate init(context: Context) {
         self.context = context


    // MARK: ContextToken

    fileprivate var contextTokens: Set<WeakReference<ContextToken>> = []

    fileprivate var unwrappedTokens: Set<ContextToken> {
        return Set(self.contextTokens.flatMap({ $0.referent }))
    }

    fileprivate func generateToken() -> ContextToken {
        let token = ContextToken(context: self)
        self.contextTokens.insert(WeakReference(referent: token))
        return token
    }

    fileprivate func remove(_ token: ContextToken) {
        self.contextTokens = Set(self.contextTokens.filter({ $0.referent != token }))
    }

    // MARK: Services

        self._equalTo = { ($0.tag as? Tag) == tag }
        self._hashValue = { tag.hashValue }
    }
    
    public var serviceID: String {
        return self._serviceID()
    }
    
    public var hashValue: Int {
        return self._hashValue()
    }
    
    public static func == (lhs: AnyContextServiceTag, rhs: AnyContextServiceTag) -> Bool {
        return lhs._equalTo(rhs)
    }
}
