     /**
      The entitlement identifier configured in the RevenueCat dashboard
      */
-    @objc public let identifier: String
+    @objc public var identifier: String { self.contents.identifier }
 
     /**
      True if the user has access to this entitlement
      */
-    @objc public let isActive: Bool
+    @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 let willRenew: Bool
+    @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 let periodType: PeriodType
+    @objc public var periodType: PeriodType { self.contents.periodType }
 
     /**
      The latest purchase or renewal date for the entitlement.
      */
-    @objc public let latestPurchaseDate: Date?
+    @objc public var latestPurchaseDate: Date? { self.contents.latestPurchaseDate }
 
     /**
      The first date this entitlement was purchased
      */
-    @objc public let originalPurchaseDate: Date?
+    @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 let expirationDate: 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 let store: Store
+    @objc public var store: Store { self.contents.store }
 
     /**
      The product identifier that unlocked this entitlement
      */
-    @objc public let productIdentifier: String
+    @objc public var productIdentifier: String { self.contents.productIdentifier }
 
     /**
      False if this entitlement is unlocked via a production purchase
      */
-    @objc public let isSandbox: Bool
+    @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 let unsubscribeDetectedAt: Date?
+    @objc public var unsubscribeDetectedAt: Date? { self.contents.unsubscribeDetectedAt }
 
     /**
      The date a billing issue was detected. Can be `nil` if there is no

    public var id: String { return self.identifier }

}

        subscription: CustomerInfoResponse.Subscription,
        requestDate: Date?
    ) {
        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 {

