#!/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;