use Glib ':constants'; use Data::Dumper; use strict; Glib::Type->register_object ('Glib::Object', 'Foo', properties => [ Glib::ParamSpec->object ('carmine', 'C', '', 'Glib::Object', G_PARAM_READWRITE), Glib::ParamSpec->string ('says', '', '', 'one boy', G_PARAM_READWRITE), Glib::ParamSpec->int ('one-boy', 'One', '', 0, 10, 2, G_PARAM_READWRITE), Glib::ParamSpec->int ('two-boy', 'Two', '', 0, 10, 4, G_PARAM_READWRITE), ], ); sub _Foo::GET_PROPERTY { my ($self, $pspec) = @_; if (exists $self->{$pspec->get_name}) { return $pspec->{$pspec->get_name}; } else { return $pspec->can ('get_default_value') ? $pspec->get_default_value : undef; } } #my @props = map { $_->{name} } Foo->list_properties; my $foo; $foo = Foo->new; $foo->_dumpprops; $foo = Foo->new (one_boy => 3); print Dumper($foo); $foo->{'one-boy'} = 1; $foo->{two_boy} = '2'; print Dumper($foo); $foo->_dumpprops; print Dumper($foo); $foo->set (carmine => Foo->new, says => "now here are two"); $foo->_dumpprops; print Dumper($foo); sub Glib::Object::_dumpprops { my $self = shift; print "$self\n"; map { printf " %20s: %s\n", $_->{name}, $self->get ($_->{name}); } $self->list_properties; #map { printf " %20s: %s\n", $_, $self->get ($_) } @props; }