Decoding objects 

instances of DecodeBson allow you to decode entire DBObjects. this example demonstrates several decoding utilities:

def bdecode4f[A, B, C, D, X](
  fxn: (A, B, C, D) => X)(ak: String, bk: String, ck: String,
  dk: String)(implicit decodea: DecodeBsonField[A], 
  decodeb: DecodeBsonField[B], decodec: DecodeBsonField[C],
  decoded: DecodeBsonField[D]): DecodeBson[X] = DecodeBson { dbo =>
  ApV.apply4(
    decodea(ak, dbo).validation,
    decodeb(bk, dbo).validation,
    decodec(ck, dbo).validation,
    decoded(dk, dbo).validation
  )(fxn).disjunction
}

of course, there are other ways to define new implementations of DecodeBson, which you can find in the Scaladocs.

Extractor syntax 

DBOWrapper defines a method decode, which looks up a DecodeBson[A].

val dbo = DBO("str" :> "some string", "anInt" :> 23, "b" :> false, "d" :> 55.3)
val v = dbo.decode[FourThings]
v === \/-(FourThings("some string", 23, false, 55.3))
decoders and fields 

any DecodeBson instance can also be used as a DecodeBsonField

val dbo = DBO("4things" :> DBO("str" :> "some string",
  "anInt" :> 23, "b" :> false, "d" :> 55.3))
val v = dbo.field[FourThings]("4things")
v === \/-(FourThings("some string", 23, false, 55.3))