use Devel::Peek;
my $obj1 = Soldier->new('Benjamin', 'Private', 11111);
my $obj2 = Soldier->new('Sanders', 'Colonel', 22222);
my $obj3 = Soldier->new('Matt', 'Sergeant', 33333);
for my $obj ($obj1, $obj2, $obj3) {
print ($obj->get_serial, ") ",
$obj->get_name, " is a ",
$obj->get_rank, "\n");
}
Dump($obj1);
print "\n";
package Soldier;
use Inline C => <<'END';
typedef struct {
char* name;
char* rank;
long serial;
} Soldier;
SV* new(char* class, char* name, char* rank, long serial) {
Soldier* soldier;
New(42, soldier, 1, Soldier);
SV* obj_ref = newSViv(0);
SV* obj = newSVrv(obj_ref, class);
soldier->name = savepv(name);
soldier->rank = savepv(rank);
soldier->serial = serial;
sv_setiv(obj, (IV)soldier);
SvREADONLY_on(obj);
return obj_ref;
}
char* get_name(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->name;
}
char* get_rank(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->rank;
}
long get_serial(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->serial;
}
void DESTROY(SV* obj) {
Soldier* soldier = (Soldier*)SvIV(SvRV(obj));
Safefree(soldier->name);
Safefree(soldier->rank);
Safefree(soldier);
}
END
__END__
Outputs:
11111) Benjamin is a Private
22222) Sanders is a Colonel
33333) Matt is a Sergeant
SV = PVIV(0x2f5b8c) at 0x2f4940
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
IV = 0
RV = 0x2f3ca4
SV = PVMG(0x2febbc) at 0x2f3ca4
REFCNT = 1
FLAGS = (OBJECT,IOK,READONLY,pIOK)
IV = 3143860
NV = 0
PV = 0
STASH = 0x45fca8 "Soldier"
PV = 0x2f3ca4 ""
CUR = 0
LEN = 0
####
SV* new(char* class, char* name, char* rank, long serial) {
Soldier* soldier;
New(42, soldier, 1, Soldier);
soldier->name = savepv(name);
soldier->rank = savepv(rank);
soldier->serial = serial;
return sv_setref_pv(newSViv(0), class, (void *)soldier);
}
####
SV* new(char* class, char* name, char* rank, long serial) {
Soldier* soldier;
SV *ret, *temp = newSViv(0);
New(42, soldier, 1, Soldier);
soldier->name = savepv(name);
soldier->rank = savepv(rank);
soldier->serial = serial;
ret = sv_setref_pv(temp, class, (void *)soldier);
SvREADONLY_on(temp);
SvREADONLY_on(ret);
return ret;
}