#!/usr/bin/perl package Node; use strict; use warnings; use Inline C => <<'__EOI__'; // XXX no children for now typedef struct Node { struct Node* parent; SV* sv; } Node; Node* new(const char * classname) { Node *self; // allocate and initialize struct Newx(self, 1, Node); self->parent = NULL; // create perl object and ref SV* perlref = newSViv((IV)self); SV* obj_ref = newRV_noinc(perlref); sv_bless(obj_ref, gv_stashpv(classname, TRUE)); SvREADONLY_on(perlref); // store pointer to object in struct self->sv = obj_ref; return self; } // should NOT alter refcount Node* set_parent(Node* self, Node* parent) { self->parent = parent; return self; } Node* get_parent(Node* self) { return self->parent; } // XXX get/set children deferred void destroy_node(Node* self) { Safefree(self); } __EOI__ sub DESTROY { my $self = shift; warn "destroying $self"; $self->destroy_node; } package main; use Devel::Peek; $|++; my $node = Node->new; my $parent = Node->new; print "NODE: "; Dump($node); print "---\n"; print "PARENT: "; Dump($parent); print "---\n"; $node->set_parent($parent); print "FROM FIELD: "; print Dump($node->get_parent); print "---\n";