import Vapor

public protocol Updatable: class {
    associatedtype Update
    func preUpdate(on req: Request) -> Future<Void>
    func update(_ update: Update) throws
}

extension Updatable {
    public func preUpdate(on req: Request) -> Future<Void> {
        return req.future()
    }
}

extension Updatable where Update: Decodable {
    public func applyUpdate(on req: Request) -> Future<Self> {
        return preUpdate(on: req)
            .flatTry {
                try req.content.decode(Update.self).map(self.update)
            }
            .transform(to: self)
    }
}

extension Future where T: Updatable, T.Update: Decodable {
    public func applyUpdate(on req: Request) -> Future<T> {
        return flatMap {
            $0.applyUpdate(on: req)
        }
    }
}

import Vapor

public protocol Updatable: class {
    associatedtype Update
    func preUpdate(on req: Request) -> Future<Void>
    func update(_ update: Update) throws
}

extension Updatable {
    public func preUpdate(on req: Request) -> Future<Void> {
        return req.future()
    }
}

extension Updatable where Update: Decodable {
    public func applyUpdate(on req: Request) -> Future<Self> {
        return preUpdate(on: req)
            .flatTry {
                try req.content.decode(Update.self).map(self.update)
            }
            .transform(to: self)
    }
}

--- 
+++ 
@@ -21,3 +21,11 @@
             .transform(to: self)
     }
 }
+
+extension Future where T: Updatable, T.Update: Decodable {
+    public func applyUpdate(on req: Request) -> Future<T> {
+        return flatMap {
+            $0.applyUpdate(on: req)
+        }
+    }
+}
Add applyUpdate helper on Future
