The core idea of entitre Ytk is YtkObject. YtkObject is abstract datatype representing single widget. In fact it doesn't need to be actually displayed (like a button), but can be for example a callback object, only function of which is to intercept events at some stage of Ytk widgets hierarchy, and do whatever application wants.
YtkObject can contain other YtkObjects -- children objects. It also knows its parent. One child is special -- the one that currently has focus -- i.e. the input line cursor is in, or highlighted button. Focused child is sent keyboard events.
YtkObject can be instance of some class, but it doesn't have to. Example of object, that doesn't need special class is callback object mentioned earlier. However most widgets has some class. These classes are registreted to the runtime Ytk system. So writing new widgets require writing function that constructs new widgets, function that respond to events from outside world (like keyprasses, or display requests), and function to free any data associated with actuall instance of widget. Then you need to register new class, under some name. After all this steps are accomplished, one can create instances of objects using just that ASCII class name.
The last thing (creating widgets using registred name) comes in very important when using heterogenic enviorment -- when using one language to write widgets and other to use them. For example Ypp widgets are written using C++, and test program is called "test.c". And, suprisingly, it works :^) There is nothing in Ytk preventing you from writing widgets in Perl and using them from C, not the other way around (although it would possibly require linking with perl interpreter).
Dynamic class registration has also several other advantages: all glue code, to link with some other (scripting or compiled) language needs to be written just once. It also simplfiy dynamic loading of widgets from modules at runtime. However it also has some dark sides... You won't notify stupid error in widget name, until runtime, in most cases you cannot perform static typechecking and so on.