'Return the value of the field ``name`` for the book identified
by ``book_id``. If no such book exists or it has no defined
value for the field ``name`` or no such field exists, then
``default_value`` is returned.
``default_value`` is not used for title, title_sort, authors, author_sort
and series_index. This is because these always have values in the db.
``default_value`` is used for all custom columns.
The returned value for is_multiple fields are always tuples, even when
no values are found (in other words, default_value is ignored). The
exception is identifiers for which the returned value is always a dict.
The returned tuples are always in link order, that is, the order in
which they were created.'

@read_api
def field_for(self, name, book_id, default_value=None):

    if (self.composites and (name in self.composites)):
        return self.composite_for(name, book_id, default_value=default_value)
    try:
        field = self.fields[name]
    except KeyError:
        return default_value
    if field.is_multiple:
        default_value = field.default_value
    try:
        return field.for_book(book_id, default_value=default_value)
    except (KeyError, IndexError):
        return default_value
