GObject Builder 介绍
GOB (GOB2 anyway) is a preprocessor for making GObjects with inline C code sothat generated files are not edited. Syntax is inspired by Java and Yacc orLex. The implementation is intentionally kept simple, and no C actual codeparsing is done.
Reasons:
- C is a perfect (well mostly) language, no need for another language
- Writing a fully featured GObject is a hassle
- GObject has little type safety, GOB improves on it.
- Need for a generator that doesn't require changes to generated code
- I like how Java writes method code directly into the class definition.
/*
* This file is a basic example of how a .gob file would be constructed,
* how to add data members, properties and methods
*/
requires 2.0.0
%{
#include <time.h>
#include "my-person.h"
#include "my-person-private.h"
%}
class My:Person from G:Object {
/* the name of the person */
private char *name = {g_strdup(_("Nobody"))}
destroywith g_free;
property STRING name
(nick = _("Name"),
blurb = _("Name of the person"),
default_value = _("Nobody"),
/* Export get/set functions for this property */
export,
/* link to the data memeber 'name' */
link);
/* date of birth as a time_t */
private long dob = 0;
property LONG dob
(nick = _("Date of birth"),
blurb = _("Date of birth of the person"),
minimum = 0,
maximum = LONG_MAX,
default_value = 0,
export)
/* We could use 'link' as above, but the code below
* shows how to do this without linking */
set {
self->_priv->dob = g_value_get_long (VAL);
}
get {
g_value_set_long (VAL, self->_priv->dob);
};
/* date of death as a time_t */
private long dod = 0;
property LONG dod
(nick = _("Date of death"),
blurb = _("Date of death of the person"),
minimum = 0,
maximum = LONG_MAX,
default_value = 0,
export,
link);
/* number of rounds in our shotgun */
private int rounds_in_shotgun = 0;
/* when the person gets born, sends out a signal, the caller
of the signal should provide the date of birth */
signal last NONE (LONG)
void
birth (self, long dob)
{
g_object_set (G_OBJECT (self),
"dob", dob);
}
/* when the person dies, sends out a signal, the caller
of the signal should provide the date of death */
signal last NONE (LONG)
void
death (self, long dod)
{
g_object_set (G_OBJECT (self),
"dod", dod);
}
public
void
load_shotgun (self)
{
/* add a round to our shotgun */
self->_priv->rounds_in_shotgun++;
}
public
void
shoot_oneself_in_the_head (self)
{
if (self->_priv->rounds_in_shotgun == 0) {
g_warning (_("No rounds in the shotgun!"));
return;
}
/* one round was fired */
self->_priv->rounds_in_shotgun--;
/* death is imminent if we shoot oneself in the head */
death (self, (long)time (NULL));
}
public GObject *
new (void)
{
return (GObject *)GET_NEW;
}
}