         subscription: CustomerInfoResponse.Subscription,
         requestDate: Date?
     ) {
-        self.entitlement = entitlement
-
-        self.store = subscription.store
-        self.expirationDate = subscription.expiresDate
-        self.unsubscribeDetectedAt = subscription.unsubscribeDetectedAt
-        self.billingIssueDetectedAt = subscription.billingIssuesDetectedAt
-        self.identifier = identifier
-        self.productIdentifier = entitlement.productIdentifier
-        self.isSandbox = subscription.isSandbox
-
-        self.isActive = Self.isDateActive(expirationDate: entitlement.expiresDate, forRequestDate: requestDate)
-        self.periodType = subscription.periodType
-        self.latestPurchaseDate = entitlement.purchaseDate
-        self.originalPurchaseDate = subscription.originalPurchaseDate
-        self.ownershipType = subscription.ownershipType
-        self.willRenew = Self.willRenewWithExpirationDate(expirationDate: self.expirationDate,
-                                                          store: self.store,
-                                                          unsubscribeDetectedAt: self.unsubscribeDetectedAt,
-                                                          billingIssueDetectedAt: self.billingIssueDetectedAt)
-    }
-
-}
-
- extension EntitlementInfo: RawDataContainer {
-
-     // Docs inherited from protocol
-     // swiftlint:disable missing_docs
-     @objc
-     public var rawData: [String: Any] {
-         return self.entitlement.rawData
-     }
-
- }
+        self.contents = .init(
+            identifier: identifier,
+            isActive: Self.isDateActive(expirationDate: entitlement.expiresDate, forRequestDate: requestDate),
+            willRenew: Self.willRenewWithExpirationDate(expirationDate: subscription.expiresDate,
+                                                        store: subscription.store,
+                                                        unsubscribeDetectedAt: subscription.unsubscribeDetectedAt,
+                                                        billingIssueDetectedAt: subscription.billingIssuesDetectedAt),
+            periodType: subscription.periodType,
+            latestPurchaseDate: entitlement.purchaseDate,
+            originalPurchaseDate: subscription.originalPurchaseDate,
+            expirationDate: subscription.expiresDate,
+            store: subscription.store,
+            productIdentifier: entitlement.productIdentifier,
+            isSandbox: subscription.isSandbox,
+            unsubscribeDetectedAt: subscription.unsubscribeDetectedAt,
+            billingIssueDetectedAt: subscription.billingIssuesDetectedAt,
+            ownershipType: subscription.ownershipType
+        )
+
+        self.rawData = entitlement.rawData
+    }
+
+    private let contents: Contents
+
+}
+
+extension EntitlementInfo: RawDataContainer {}
 
 private extension EntitlementInfo {
 

     - Note: Entitlement may still be active even if there is a billing issue.
     Check the ``isActive`` property.
     */
    @objc public let billingIssueDetectedAt: Date?

    /**
     Use this property to determine whether a purchase was made by the current user
     or shared to them by a family member. This can be useful for onboarding users who have had
     an entitlement shared with them, but might not be entirely aware of the benefits they now have.
     */
    @objc public let ownershipType: PurchaseOwnershipType

    private let entitlement: CustomerInfoResponse.Entitlement

    public override var description: String {
        return """

    /**
     The entitlement identifier configured in the RevenueCat dashboard
     */
    @objc public var identifier: String { self.contents.identifier }

    /**
     True if the user has access to this entitlement
     */
    @objc public var isActive: Bool { self.contents.isActive }

    /**
     True if the underlying subscription is set to renew at the end of
     the billing period (``expirationDate``).
     */
    @objc public var willRenew: Bool { self.contents.willRenew }

    /**
     The last period type this entitlement was in
     Either: ``PeriodType/normal``, ``PeriodType/intro``, ``PeriodType/trial``
     */
    @objc public var periodType: PeriodType { self.contents.periodType }

    /**
     The latest purchase or renewal date for the entitlement.
     */
    @objc public var latestPurchaseDate: Date? { self.contents.latestPurchaseDate }

    /**
     The first date this entitlement was purchased
     */
    @objc public var originalPurchaseDate: Date? { self.contents.originalPurchaseDate }

    /**
     The expiration date for the entitlement, can be `nil` for lifetime access.
     If the ``periodType`` is ``PeriodType/trial``, this is the trial expiration date.
     */
    @objc public var expirationDate: Date? { self.contents.expirationDate }

    /**
     * The store where this entitlement was unlocked from either: ``Store/appStore``, ``Store/macAppStore``,
     * ``Store/playStore``, ``Store/stripe``, ``Store/promotional``, or ``Store/unknownStore``.
     */
    @objc public var store: Store { self.contents.store }

    /**
     The product identifier that unlocked this entitlement
     */
    @objc public var productIdentifier: String { self.contents.productIdentifier }

    /**
     False if this entitlement is unlocked via a production purchase
     */
    @objc public var isSandbox: Bool { self.contents.isSandbox }

    /**
     The date an unsubscribe was detected. Can be `nil`.

     - Note: Entitlement may still be active even if user has unsubscribed. Check the ``isActive`` property.
     */
    @objc public var unsubscribeDetectedAt: Date? { self.contents.unsubscribeDetectedAt }

    /**
     The date a billing issue was detected. Can be `nil` if there is no
