/**
  * Returns a filtered version of this booking.
  *
  * @param string $filter The filter context.
  * @return self|array|bool|object|BTB_Booking
  */
 public function filter($filter)
 {
     if ($this->filter == $filter) {
         return $this;
     }
     if ($filter == 'raw') {
         return self::get_instance($this->ID);
     }
     return btb_sanitize_booking($this, $filter);
 }
/**
 * @brief Retrieves booking data given a booking ID or booking object.
 *
 * @see sanitize_booking() for optional $filter values. Also, the parameter $booking
 * must be given as a variable, since it is passed by reference.
 *
 * @param int|BTB_Booking	$booking Booking ID or BTB_Booking object.
 * @param string 			$output Optional, default is Object. Accepts OBJECT, ARRAY_A or ARRAY_N.
 * @param string			$filter Optional. Type fo filter to apply. Accepts 'raw', 'edit', 'db', 'display',
 *									'attribute' or 'js'. Default 'raw'.
 * @return BTB_Booking|array|null	Type corresponding to $output on success or null on failure.
 *						      		When $output is OBJECT, a `BTB_Booking` instance is returned.
 */
function btb_get_booking($booking, $output = OBJECT, $filter = 'raw')
{
    if ($booking instanceof BTB_Booking) {
        $_booking = $booking;
    } elseif (is_object($booking)) {
        if (empty($booking->filter)) {
            $_booking = btb_sanitize_booking($booking, 'raw');
            $_booking = new BTB_Booking($_booking);
        } elseif ('raw' == $booking->filter) {
            $_booking = new BTB_Booking($booking);
        } else {
            $_booking = BTB_Booking::get_instance($booking->ID);
        }
    } else {
        $_booking = BTB_Booking::get_instance($booking);
    }
    if (!$_booking) {
        return null;
    }
    $_booking = $_booking->filter($filter);
    if ($output == ARRAY_A) {
        return $_booking->to_array();
    } elseif ($output == ARRAY_N) {
        return array_values($_booking->to_array());
    }
    return $_booking;
}