\section{The VIPS base class: \texttt{VipsObject}}
\label{sec:object}

VIPS is in the process of moving to an object system based on \verb+GObject+.
You can read about the \verb+GObjec+ library at the GTK+ website:

\begin{verbatim}
http://www.gtk.org
\end{verbatim}

We've implemented two new subsystems (\verb+VipsFormat+ and
\verb+VipsInterpolate+) on top of \verb+VipsObject+ but not yet moved the core
VIPS types over. As a result, \verb+VipsObject+ is still developing and is
likely to change in the next release.

This section quickly summarises enough of the \verb+VipsObject+ system to let
you use the two derived APIs but that's all. Full documentation will come when
this system stabilises.

\subsection{Properties}

Like the rest of VIPS, \verb+VipsObject+ is a functional type. You can set
properties during object construction, but not after that point. You may read
properties at any time after construction, but not before.

To enforce these rules, VIPS extends the standard \verb+GObject+ property 
system and adds a new phase to object creation. An object has the following
stages in its life:

\subsubsection{Lookup}

\verb+vips_type_find()+ is a convenience function that looks up a type by its
nickname relative to a base class. For example:

\begin{verbatim}
GType type = 
  vips_type_find( "VipsInterpolate", "bilinear" );
\end{verbatim}

\noindent
finds a subclass of \verb+VipsInterpolate+ nicknamed `bilinear'. You can look
up types by their full name of course, but these can be rather unwieldy
(\verb+VipsInterpolateBilinear+ in this case, for example).

\subsubsection{Create}

Build an instance with \verb+g_object_new()+. For example:

\begin{verbatim}
VipsObject *object =
  g_object_new( type,
    "sharpness", 12.0,
    NULL );
\end{verbatim}

You can set any of the object's properties in the constructor. You can
continue to set, but not read, any other properties, for example:

\begin{verbatim}
g_object_set( object,
    "sharpness", 12.0,
    NULL );
\end{verbatim}

You can loop over an object's required and optional parameters with
\verb+vips_argument_map()+.

\subsubsection{Build}

Once all of the required any any of the optional object parameters have been
set, call \verb+vips_object_build()+:

\begin{verbatim}
int vips_object_build( VipsObject *object );
\end{verbatim}

This function checks that all the parameters have been set correctly and
starts the object working. It returns non-zero on error, setting
\verb+im_error_string()+.

\subsubsection{Use}

The object is now fully working. You can read results from it, or pass it on 
other objects. When you're finished with it, drop your reference to end its
life.

\begin{verbatim}
g_object_unref( object );
\end{verbatim}

\subsection{Convenience functions}

Two functions simplify building and printing objects.
\verb+vips_object_new_from_string()+ makes a new object which is a subclass of
a named base class.

\begin{verbatim}
VipsObject *
  vips_object_new_from_string( 
    const char *basename, const char *p );
\end{verbatim}

This is the function used by \verb+IM_INPUT_INTERPOLATE()+, for example, to
parse command-line arguments. The syntax is:

\begin{verbatim}
nickname [ ( required-arg1, 
  ...
  required-argn,
  optional-arg-name = value,
  ...
  optional-argm-name = value ) ]
\end{verbatim}

So values for all the required arguments, in the correct order, then name =
value for all the optional arguments you want to set. Parameters may be
enclosed in round or curly braces.

\verb+vips_object_to_string()+ is the exact opposite: it generates the 
construct string for any constructed
\verb+VipsObject+.

\verb+vips_object_new()+ wraps up the business of creating and checking an
object. It makes the object, uses the supplied function to attach any
arguments, then builds the object and returns NULL on failure or the new
object on success.

A switch to the \verb+vips+ command-line program is handy for listing subtypes
of \verb+VipsObject+. Try:

\begin{verbatim}
$ vips --list classes
\end{verbatim}

