/*!

\mainpage

The \c read* files have functions that take \c UsdSchema objects and populate
\c PxrUsdKatanaAttrMap with attributes.  For now, all the logic is bundled but if
other ops need access to just specific pieces of that data, we can expose other
functions.

\section PxrOpUsdInPlugins Extending PxrUsdOpIn Plugins

This library provides a mechanism to create new ops that handle different types
and kinds.  To teach the \c PxrOpUsdIn op about new types (or kinds), first
declare your op:

\code
PXRUSDKATANA_OPUSDIN_PLUGIN_DECLARE(MyOp)
\endcode

and then define the ops behavior:

\code
PXRUSDKATANA_OPUSDIN_PLUGIN_DEFINE(MyOp, args, interface)
{
    // all ops need to be safe to run concurrently
}
\endcode

The above function body should be written as if it were the definition of the
function:
\code
void Function(
    const PxrUsdKatanaOpUsdInPrivateData& args,
    Foundry::Katnaa::GeolibCookInterface& interfac);
\endcode

Finally, the plugin needs to be registered with katana and the registry:
\code
REGISTER_PLUGIN(MyOp, "MyOp", 0, 1);

// for UsdMyType
PxrUsdKatanaOpUsdInPluginRegistry::RegisterUsdType<UsdMyType>("MyOp");

// for kind
PxrUsdKatanaOpUsdInPluginRegistry::RegisterKind(TfToken("myKind"), "MyOp");
\endcode

\sa PxrUsdKatanaOpUsdInPluginRegistry
\sa PxrUsdKatanaOpUsdInPrivateData
\sa PxrUsdKatanaOpUsdInRootArgs

*/
