#!/usr/bin/perl use HTML::FillInForm; use strict; { # Fake a CDBI 'MyUser' class (hardcoded to 'Roger Rabbit') package MyUser; sub create { return bless {} } sub id { 1; } sub first { return 'Roger'; } sub last { return 'Rabbit'; } sub mailinglist { return 1; } sub profession { return MyProfession->create; } # Fake a CDBI 'MyProfession' class (hardcoded to 'Actor') package MyProfession; sub create { return bless {} } sub id { return 3; } sub name { return 'Actor'; } } { # Class for translating between Class::DBI and # HTML::FillInForm # - Note: doesn't handle has_many fields package FIF_CDBI_Bridge; sub new { my $class = shift; my %args = @_; my $objects = $args{'objects'} || {}; my $self = { objects => $objects, }; return bless $self; } sub param { my $self = shift; my $name = shift; # e.g. user.first my ($obj_name, $meth_name) = split /\./, $name; my $object = $self->{'objects'}{$obj_name}; return unless $object; return unless $object->can($meth_name); # e.g. $user->first my $value = $object->$meth_name; # if we get an object, return $object->id if (ref $value) { if ($value->can('id')) { $value = $value->id; } } return $value; } } my $form = <
First Name:
Last Name:
If you have a really long last name, use the textarea:

On mailing list:
Profession (radio):
Doctor
Lawyer
Actor Profession (select): EOF my $user = MyUser->create; my $bridge = FIF_CDBI_Bridge->new( objects => { user => $user, } ); my $fif = new HTML::FillInForm; my $output = $fif->fill(scalarref => \$form, fobject => $bridge); print $output;