/*
 * call-seq:
 *      sender -> string
 *
 * The private group name of the Spread node that sent the message.
 */
static VALUE
sm_sender(VALUE obj)
{
    /*
     * The various message types store different stuff in the `sender'
     * field, but since it's always a NUL-terminated string, the
     * implementation remains the same.
     */
    struct SpreadMessage *sp_mess;

    Data_Get_Struct(obj, struct SpreadMessage, sp_mess);
    /* XXX: is it worth memo-izing this? */
    return rb_str_new2(sp_mess->sender);
}