 
     beforeSave: (cb) -> cb()
 
-    save: (cb = ->) ->
-      # TODO: defaults, required
-      @beforeSave (err) =>
-        return cb err if err?
+    save: (cb) ->
+      beforeSave = Promise.promisify @beforeSave, @
+
+      promise = beforeSave().then =>
+        # TODO: defaults, required
         c = @constructor
         newObj = {}
         # newObj[key] = @[key] for key, value of @
 
-        @validateTypes (err) =>
-          return cb err if err?
-
+        @validateTypes().then =>
           if c.timestamp and c.schema.modifiedAt and !@isNewRecord
             @modifiedAt = new Date
 


          if @isNewRecord
            newObj.id = @getId() if @getId()?
            db.run c.r().insert(newObj), (err, reply) =>
              return cb err if err?

              unless @id?
                @id = reply?.generated_keys?[0]

              @isNewRecord = no

              @saveRelated (err) => cb err, reply

          else
            @saveRelated (err) =>
              return cb "undefined id" unless @getId()?
              db.run c.r().get(@getId()).update(newObj), cb

    saveRelated: (cb) ->
      c = @constructor

            # console.log key, typeOf(newObj[key]) if newObj[key]?

            if typeOf(opts) is 'object' and Object.keys(opts).length
              return reject new ValidationError "Type not specified for `#{key}`" unless opts.type?

            # if typeOf(opts) is 'object' (typeOf(opts) is 'object' and opts.type?)

              if opts.required and not newObj[key]?
                return reject new ValidationError "#{key} field is required"

              switch opts.type
                when String
