code: @SuppressWarnings("unchecked")
          public final <B> Option<B> flatMap(final Function<? super T, Option<B>> mapper) {
              E.NPE(mapper);
              Option<B> result = isDefined() ? mapper.apply(get()) : NONE;
              E.NPE(null == result);
              return result;
          }
docs: If a value is present, apply the provided {@code Option}-bearing
  mapping function to it, return that result, otherwise return
  {@link #NONE}. This method is similar to {@link #map(Function)},
  but the provided mapper is one whose result is already an
  {@code Option}, and if invoked, {@code flatMap} does not wrap it
  with an additional {@code Option}.
  
  @param <B>
  The type parameter to the {@code Option} returned by
  @param mapper
  a mapping function to apply to the value,
  @return the result of applying an {@code Option}-bearing mapping
  function to the value of this {@code Option}, if a value
  is present, otherwise {@link #NONE}
  @throws NullPointerException
  if the mapping function is {@code null}
  or returns a {@code null} result
  @since 0.2