 
         if gen.next() != nil { return nil } // trailing characters
 
-        let dtm = BricDateTime(year: year, month: month, day: day, hour: hour, minute: minute, second: second, zone: (tzh, tzm))
-        self = dtm
-    }
-
-    public var description: String { return toISO8601String() }
-
-    public var hashValue: Int { return year }
-
-    public func breq(other: BricDateTime) -> Bool {
-        return self.year == other.year
-            && self.month == other.month
-            && self.day == other.day
-            && self.hour == other.hour
-            && self.minute == other.minute
-            && self.second == other.second
-            && self.zone.hours == other.zone.hours
-            && self.zone.minutes == other.zone.minutes
-    }
-
-    /// BricDateTime instances are serialized to ISO-8601 strings
-    public func bric() -> Bric {
-        return Bric.Str(toISO8601String())
-    }
-
-    /// BricDateTime instances are serialized to ISO-8601 strings
-    public static func brac(bric: Bric) throws -> BricDateTime {
-        guard case .Str(let str) = bric else { return try bric.invalidType() }
-        guard let dtm = BricDateTime(str) else { return try bric.invalidRawValue(str) }
+        // fill in the fields
+        var dtm = self
+        dtm.year = year
+        dtm.month = month
+        dtm.day = day
+        dtm.hour = hour
+        dtm.minute = minute
+        dtm.second = second
+        dtm.zone = (tzh, tzm)
         return dtm
     }
 }

        self.zone = zone
    }

    public var date: BricDate { return (year, month, day) }
    public var time: BricTime { return (hour, minute, second) }

    public func toISO8601String() -> String {
        func pad(num: Int, _ len: Int) -> String {
            var str = String(num)
            while str.characters.count < len {

}


/// An ISO-8601 date-time structure, the common JSON format for dates and times
/// - See: https://en.wikipedia.org/wiki/ISO_8601
public protocol ISO8601DateTime {
    var year: Int { get set }
    var month: Int { get set }
    var day: Int { get set }
    var hour: Int { get set }
    var minute: Int { get set }
    var second: Double { get set }
    var zone: (hours: Int, minutes: Int) { get set }
}


public struct BricDateTime: ISO8601DateTime, Hashable, Equatable, CustomStringConvertible, Bricable, Bracable, Breqable {
    public typealias BricDate = (year: Int, month: Int, day: Int)
    public typealias BricTime = (hour: Int, minute: Int, second: Double)
    public typealias BricZone = (hours: Int, minutes: Int)

    public var year, month, day, hour, minute: Int
    public var second: Double
    public var zone: BricZone

    public init(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Double, zone: BricZone) {
        self.year = year
