     return lhs.value == rhs.value
 }
 
+/// This protocol outlines the requirement of a type that
+/// can be converted to a `JSON`
+public protocol JSONRepresentable {
+    /// Call this method to get a `JSON` representation of `Self`
+    /// - Returns: The json representation of `Self`
+    func toJSON() -> JSON
+}
+
+/// This protocol outlines the requirement of a type that
+/// can created from a `JSON`
+public protocol JSONInitializable {
+    /// Required initializer
+    /// - Parameters:
+    ///  - id: An ID struct uniquely identifying `Self`
+    ///  - hash: A dictionary of [String: Any]
+    init(id: ID, hash: JSON) throws
+}
+
 /// Record
 /// This protocol outline requirements for
 /// a type that can be managed by the `Store`

    /// A unique identifier for a `Self`
    var id: ID? { get }
    /// The type class to be used to make network request
    /// for `Self`. Default value is the `JSONAdapter`.
    static var adapterType: Adapter.Type { get }
    /// The type class to be used to serializer and normalize
    /// `Self`. Default value is the `JSONSerializer`.

//  Created by Ahmed Onawale on 2/4/17.
//  Copyright © 2017 Ahmed Onawale. All rights reserved.
//

/// Unique Record identifier.
/// Conforms to Hashable protocol
