Typedef / Struct Forward Declaration in Straight C

If I want to create an opaque typedef of a struct called Foo and I want to encapsulate it by only allowing the library user to use the struct according to the functions I provide, without littering their code with 'struct Foo' everywhere? It's a little confusing to set up but easy if you know the formula.


struct FooTag; // "Tag" could be anything
               // but the struct and typedef need separate names
typedef struct FooTag Foo;
Foo* Foo_Init(int bar, int baz);
bool Foo_IsReady(int bat, int bash);


struct FooTag
 ... // fill out fields of struct here;
     // consumer of Foo.h cannot poke inside Foo structs
 int FooMitzvah;
 ... // etc.

Simple to use, confusing the way the pieces come together.