migrate Settings operation to FormBuilder

This commit is contained in:
Doug Bell 2011-02-10 18:49:34 -06:00
parent 98816c4b6b
commit a3a5d44a7b
6 changed files with 261 additions and 197 deletions

View file

@ -69,16 +69,16 @@ sub editUserSettingsForm {
my ( $setting ) = $session->quick(qw( setting ));
my $i18n = WebGUI::International->new( $session, 'Auth_Facebook' );
my $f = WebGUI::HTMLForm->new( $session );
my $f = WebGUI::FormBuilder->new( $session );
$f->yesNo(
$f->addField( "yesNo",
name => 'facebookAuthEnabled',
value => $setting->get( 'facebookAuthEnabled' ),
label => $i18n->get('enabled'),
hoverHelp => $i18n->get('enabled help'),
);
$f->text(
$f->addField( "text",
name => 'facebookAuthAppId',
value => $setting->get( 'facebookAuthAppId' ),
label => $i18n->get('app id'),
@ -86,14 +86,14 @@ sub editUserSettingsForm {
subtext => $i18n->get('get app id'),
);
$f->text(
$f->addField( "text",
name => 'facebookAuthSecret',
value => $setting->get( 'facebookAuthSecret' ),
label => $i18n->get('secret'),
hoverHelp => $i18n->get('secret help'),
);
$f->template(
$f->addField( "template",
name => 'facebookAuthTemplateIdChooseUsername',
value => $setting->get( 'facebookAuthTemplateIdChooseUsername' ),
label => $i18n->get('choose username template'),
@ -101,7 +101,7 @@ sub editUserSettingsForm {
namespace => 'Auth/Facebook/ChooseUsername',
);
return $f->printRowsOnly;
return $f;
}
#----------------------------------------------------------------------------

View file

@ -12,7 +12,7 @@ package WebGUI::Auth::LDAP;
use strict;
use WebGUI::Auth;
use WebGUI::HTMLForm;
use WebGUI::FormBuilder;
use WebGUI::Form;
use WebGUI::LDAPLink;
use WebGUI::Workflow;
@ -327,21 +327,9 @@ sub editUserFormSave {
sub editUserSettingsForm {
my $self = shift;
my $f = WebGUI::HTMLForm->new($self->session);
my $ldapConnection = WebGUI::Form::selectBox($self->session, {
name=>"ldapConnection",
options=>WebGUI::LDAPLink->getList($self->session,),
value=>[$self->session->setting->get("ldapConnection")]
});
my $i18n = WebGUI::International->new($self->session,'AuthLDAP');
my $ldapConnectionLabel = $i18n->get("ldapConnection");
my $buttons = "";
if($self->session->setting->get("ldapConnection")) {
$buttons = $self->session->icon->edit("op=editLDAPLink;returnUrl=".$self->session->url->escape($self->session->url->page("op=editSettings")).";llid=".$self->session->setting->get("ldapConnection"));
}
$buttons .= $self->session->icon->manage("op=listLDAPLinks;returnUrl=".$self->session->url->escape($self->session->url->page("op=editSettings")));
$f->raw(qq|<tr><td class="formDescription" valign="top" style="width: 25%;">$ldapConnectionLabel</td><td class="tableData" style="width: 75%;">$ldapConnection&nbsp;$buttons</td></tr>|);
return $f->printRowsOnly;
my $f = WebGUI::FormBuilder->new($self->session);
$f->addField( "LdapLink", name => "ldapConnection" );
return $f;
}
#-------------------------------------------------------------------

View file

@ -69,16 +69,16 @@ sub editUserSettingsForm {
my $keyUrl = 'http://dev.twitter.com/apps/new';
my $f = WebGUI::HTMLForm->new( $session );
my $f = WebGUI::FormBuilder->new( $session );
$f->yesNo(
$f->addField( "yesNo",
name => 'twitterEnabled',
value => $setting->get( 'twitterEnabled' ),
label => $i18n->get('enabled'),
hoverHelp => $i18n->get('enabled help'),
);
$f->text(
$f->addField( "text",
name => 'twitterConsumerKey',
value => $setting->get( 'twitterConsumerKey' ),
label => $i18n->get('consumer key'),
@ -86,14 +86,14 @@ sub editUserSettingsForm {
subtext => sprintf( $i18n->get('get key'), ($keyUrl) x 2 ),
);
$f->text(
$f->addField( "text",
name => 'twitterConsumerSecret',
value => $setting->get( 'twitterConsumerSecret' ),
label => $i18n->get('consumer secret'),
hoverHelp => $i18n->get('consumer secret help'),
);
$f->template(
$f->addField( "template",
name => 'twitterTemplateIdChooseUsername',
value => $setting->get( 'twitterTemplateIdChooseUsername' ),
label => $i18n->get('choose username template'),
@ -101,7 +101,7 @@ sub editUserSettingsForm {
namespace => 'Auth/Twitter/ChooseUsername',
);
return $f->printRowsOnly;
return $f;
}
#----------------------------------------------------------------------------

View file

@ -15,7 +15,7 @@ use strict;
use URI;
use WebGUI::Asset::Template;
use WebGUI::Auth;
use WebGUI::HTMLForm;
use WebGUI::FormBuilder;
use WebGUI::Macro;
use WebGUI::Mail::Send;
use WebGUI::Storage;
@ -154,39 +154,39 @@ or an empty string if the check was successful.
sub editUserForm {
my $self = shift;
my $userData = $self->get;
my $f = WebGUI::HTMLForm->new($self->session);
my $f = WebGUI::FormBuilder->new($self->session);
my $i18n = WebGUI::International->new($self->session);
$f->password(
$f->addField( "password",
name=>"authWebGUI.identifier",
label=>$i18n->get(51),
value=>"password",
extras=>'autocomplete="off"',
);
$f->interval(
-name=>"authWebGUI.passwordTimeout",
-label=>$i18n->get(16,'AuthWebGUI'),
-value=>$userData->{passwordTimeout},
-defaultValue=>$self->session->setting->get("webguiPasswordTimeout")
$f->addField( "interval",
name=>"authWebGUI.passwordTimeout",
label=>$i18n->get(16,'AuthWebGUI'),
value=>$userData->{passwordTimeout},
defaultValue=>$self->session->setting->get("webguiPasswordTimeout")
);
my $userChange = $self->session->setting->get("webguiChangeUsername");
if($userChange || $userChange eq "0"){
$userChange = $userData->{changeUsername};
}
$f->yesNo(
-name=>"authWebGUI.changeUsername",
-value=>$userChange,
-label=>$i18n->get(21,'AuthWebGUI')
$f->addField( "yesNo",
name=>"authWebGUI.changeUsername",
value=>$userChange,
label=>$i18n->get(21,'AuthWebGUI')
);
my $passwordChange = $self->session->setting->get("webguiChangePassword");
if($passwordChange || $passwordChange eq "0"){
$passwordChange = $userData->{changePassword};
}
$f->yesNo(
-name=>"authWebGUI.changePassword",
-value=>$passwordChange,
-label=>$i18n->get(20,'AuthWebGUI')
$f->addField( "yesNo",
name=>"authWebGUI.changePassword",
value=>$passwordChange,
label=>$i18n->get(20,'AuthWebGUI')
);
return $f->printRowsOnly;
return $f;
}
#-------------------------------------------------------------------
@ -233,165 +233,165 @@ sub editUserFormSave {
sub editUserSettingsForm {
my $self = shift;
my $i18n = WebGUI::International->new($self->session,'AuthWebGUI');
my $f = WebGUI::HTMLForm->new($self->session);
my $f = WebGUI::FormBuilder->new($self->session);
$f->integer(
-name => "webguiPasswordLength",
-value => $self->session->setting->get("webguiPasswordLength"),
-label => $i18n->get(15),
-hoverHelp => $i18n->get('15 help'),
$f->addField( "integer",
name => "webguiPasswordLength",
value => $self->session->setting->get("webguiPasswordLength"),
label => $i18n->get(15),
hoverHelp => $i18n->get('15 help'),
);
$f->integer(
-name => "webguiRequiredDigits",
-label => $i18n->get('setting webguiRequiredDigits'),
-value => $self->session->setting->get("webguiRequiredDigits"),
-hoverHelp => $i18n->get('setting webguiRequiredDigits help'),
$f->addField( "integer",
name => "webguiRequiredDigits",
label => $i18n->get('setting webguiRequiredDigits'),
value => $self->session->setting->get("webguiRequiredDigits"),
hoverHelp => $i18n->get('setting webguiRequiredDigits help'),
);
$f->integer(
-name => "webguiNonWordCharacters",
-label => $i18n->get('setting webguiNonWordCharacters'),
-value => $self->session->setting->get("webguiNonWordCharacters"),
-hoverHelp => $i18n->get('setting webguiNonWordCharacters help'),
$f->addField( "integer",
name => "webguiNonWordCharacters",
label => $i18n->get('setting webguiNonWordCharacters'),
value => $self->session->setting->get("webguiNonWordCharacters"),
hoverHelp => $i18n->get('setting webguiNonWordCharacters help'),
);
$f->integer(
-name => "webguiRequiredMixedCase",
-label => $i18n->get('setting webguiRequiredMixedCase'),
-value => $self->session->setting->get("webguiRequiredMixedCase"),
-hoverHelp => $i18n->get('setting webguiRequiredMixedCase help'),
$f->addField( "integer",
name => "webguiRequiredMixedCase",
label => $i18n->get('setting webguiRequiredMixedCase'),
value => $self->session->setting->get("webguiRequiredMixedCase"),
hoverHelp => $i18n->get('setting webguiRequiredMixedCase help'),
);
$f->interval(
-name => "webguiPasswordTimeout",
-label => $i18n->get(16),
-value => $self->session->setting->get("webguiPasswordTimeout"),
-hoverHelp => $i18n->get('16 help'),
$f->addField( "interval",
name => "webguiPasswordTimeout",
label => $i18n->get(16),
value => $self->session->setting->get("webguiPasswordTimeout"),
hoverHelp => $i18n->get('16 help'),
);
$f->yesNo(
-name => "webguiExpirePasswordOnCreation",
-value => $self->session->setting->get("webguiExpirePasswordOnCreation"),
-label => $i18n->get(9),
-hoverHelp => $i18n->get('9 help')
$f->addField( "yesNo",
name => "webguiExpirePasswordOnCreation",
value => $self->session->setting->get("webguiExpirePasswordOnCreation"),
label => $i18n->get(9),
hoverHelp => $i18n->get('9 help')
);
$f->yesNo(
-name => "webguiSendWelcomeMessage",
-value => $self->session->setting->get("webguiSendWelcomeMessage"),
-label => $i18n->get(868,'WebGUI'),
-hoverHelp => $i18n->get('868 help','WebGUI'),
$f->addField( "yesNo",
name => "webguiSendWelcomeMessage",
value => $self->session->setting->get("webguiSendWelcomeMessage"),
label => $i18n->get(868,'WebGUI'),
hoverHelp => $i18n->get('868 help','WebGUI'),
);
$f->HTMLArea(
-name => "webguiWelcomeMessage",
-value => $self->session->setting->get("webguiWelcomeMessage"),
-label => $i18n->get(869,'WebGUI'),
-hoverHelp => $i18n->get('869 help','WebGUI'),
$f->addField( "HTMLArea",
name => "webguiWelcomeMessage",
value => $self->session->setting->get("webguiWelcomeMessage"),
label => $i18n->get(869,'WebGUI'),
hoverHelp => $i18n->get('869 help','WebGUI'),
);
$f->yesNo(
-name => "webguiUseEmailAsUsername",
-value => $self->session->setting->get("webguiUseEmailAsUsername"),
-label => $i18n->get('use email as username label'),
-hoverHelp => $i18n->get('use email as username description'),
$f->addField( "yesNo",
name => "webguiUseEmailAsUsername",
value => $self->session->setting->get("webguiUseEmailAsUsername"),
label => $i18n->get('use email as username label'),
hoverHelp => $i18n->get('use email as username description'),
);
$f->yesNo(
-name => "webguiChangeUsername",
-value => $self->session->setting->get("webguiChangeUsername"),
-label => $i18n->get(19),
-hoverHelp => $i18n->get('19 help'),
$f->addField( "yesNo",
name => "webguiChangeUsername",
value => $self->session->setting->get("webguiChangeUsername"),
label => $i18n->get(19),
hoverHelp => $i18n->get('19 help'),
);
$f->yesNo(
-name => "webguiChangePassword",
-value => $self->session->setting->get("webguiChangePassword"),
-label => $i18n->get(18),
-hoverHelp => $i18n->get('18 help'),
$f->addField( "yesNo",
name => "webguiChangePassword",
value => $self->session->setting->get("webguiChangePassword"),
label => $i18n->get(18),
hoverHelp => $i18n->get('18 help'),
);
$f->selectList(
-name => "webguiPasswordRecovery",
-value => $self->session->setting->get("webguiPasswordRecovery"),
-label => $i18n->get(6),
-hoverHelp => $i18n->get('webguiPasswordRecovery hoverHelp'),
-options => $self->getPasswordRecoveryTypesAvailable,
-size => 1,
-multiple => 0,
$f->addField( "selectList",
name => "webguiPasswordRecovery",
value => $self->session->setting->get("webguiPasswordRecovery"),
label => $i18n->get(6),
hoverHelp => $i18n->get('webguiPasswordRecovery hoverHelp'),
options => $self->getPasswordRecoveryTypesAvailable,
size => 1,
multiple => 0,
);
$f->yesNo(
-name => "webguiPasswordRecoveryRequireUsername",
-value => $self->session->setting->get("webguiPasswordRecoveryRequireUsername"),
-label => $i18n->get('require username for password recovery'),
-hoverHelp => $i18n->get('webguiPasswordRecoveryRequireUsername hoverHelp'),
$f->addField( "yesNo",
name => "webguiPasswordRecoveryRequireUsername",
value => $self->session->setting->get("webguiPasswordRecoveryRequireUsername"),
label => $i18n->get('require username for password recovery'),
hoverHelp => $i18n->get('webguiPasswordRecoveryRequireUsername hoverHelp'),
);
$f->yesNo(
-name => "webguiValidateEmail",
-value => $self->session->setting->get("webguiValidateEmail"),
-label => $i18n->get('validate email'),
-hoverHelp => $i18n->get('validate email help'),
$f->addField( "yesNo",
name => "webguiValidateEmail",
value => $self->session->setting->get("webguiValidateEmail"),
label => $i18n->get('validate email'),
hoverHelp => $i18n->get('validate email help'),
);
$f->yesNo(
-name => "webguiUseCaptcha",
-value => $self->session->setting->get("webguiUseCaptcha"),
-label => $i18n->get('use captcha'),
-hoverHelp => $i18n->get('use captcha help'),
$f->addField( "yesNo",
name => "webguiUseCaptcha",
value => $self->session->setting->get("webguiUseCaptcha"),
label => $i18n->get('use captcha'),
hoverHelp => $i18n->get('use captcha help'),
);
$f->template(
-name => "webguiAccountTemplate",
-value => $self->session->setting->get("webguiAccountTemplate"),
-namespace => "Auth/WebGUI/Account",
-label => $i18n->get("account template"),
-hoverHelp => $i18n->get("account template help"),
$f->addField( "template",
name => "webguiAccountTemplate",
value => $self->session->setting->get("webguiAccountTemplate"),
namespace => "Auth/WebGUI/Account",
label => $i18n->get("account template"),
hoverHelp => $i18n->get("account template help"),
);
$f->template(
-name => "webguiCreateAccountTemplate",
-value => $self->session->setting->get("webguiCreateAccountTemplate"),
-namespace => "Auth/WebGUI/Create",
-label => $i18n->get("create account template"),
-hoverHelp => $i18n->get("create account template help"),
$f->addField( "template",
name => "webguiCreateAccountTemplate",
value => $self->session->setting->get("webguiCreateAccountTemplate"),
namespace => "Auth/WebGUI/Create",
label => $i18n->get("create account template"),
hoverHelp => $i18n->get("create account template help"),
);
$f->template(
-name => "webguiDeactivateAccountTemplate",
-value => $self->session->setting->get("webguiDeactivateAccountTemplate"),
-namespace => "Auth/WebGUI/Deactivate",
-label => $i18n->get("deactivate account template"),
-hoverHelp => $i18n->get("deactivate account template help"),
$f->addField( "template",
name => "webguiDeactivateAccountTemplate",
value => $self->session->setting->get("webguiDeactivateAccountTemplate"),
namespace => "Auth/WebGUI/Deactivate",
label => $i18n->get("deactivate account template"),
hoverHelp => $i18n->get("deactivate account template help"),
);
$f->template(
-name => "webguiExpiredPasswordTemplate",
-value => $self->session->setting->get("webguiExpiredPasswordTemplate"),
-namespace => "Auth/WebGUI/Expired",
-label => $i18n->get("expired password template"),
-hoverHelp => $i18n->get("expired password template"),
$f->addField( "template",
name => "webguiExpiredPasswordTemplate",
value => $self->session->setting->get("webguiExpiredPasswordTemplate"),
namespace => "Auth/WebGUI/Expired",
label => $i18n->get("expired password template"),
hoverHelp => $i18n->get("expired password template"),
);
$f->template(
-name => "webguiLoginTemplate",
-value => $self->session->setting->get("webguiLoginTemplate"),
-namespace => "Auth/WebGUI/Login",
-label => $i18n->get("login template"),
-hoverHelp => $i18n->get("login template help"),
$f->addField( "template",
name => "webguiLoginTemplate",
value => $self->session->setting->get("webguiLoginTemplate"),
namespace => "Auth/WebGUI/Login",
label => $i18n->get("login template"),
hoverHelp => $i18n->get("login template help"),
);
$f->template(
-name => "webguiPasswordRecoveryTemplate",
-value => $self->session->setting->get("webguiPasswordRecoveryTemplate"),
-namespace => "Auth/WebGUI/Recovery2",
-label => $i18n->get("password recovery template"),
-hoverHelp => $i18n->get("password recovery template help")
$f->addField( "template",
name => "webguiPasswordRecoveryTemplate",
value => $self->session->setting->get("webguiPasswordRecoveryTemplate"),
namespace => "Auth/WebGUI/Recovery2",
label => $i18n->get("password recovery template"),
hoverHelp => $i18n->get("password recovery template help")
);
$f->template(
-name => "webguiPasswordRecoveryEmailTemplate",
-value => $self->session->setting->get('webguiPasswordRecoveryEmailTemplate'),
-label => $i18n->get('Password Recovery Email Template'),
-hoverHelp => $i18n->get("password recovery email template help"),
-namespace => "Auth/WebGUI/RecoveryEmail",
$f->addField( "template",
name => "webguiPasswordRecoveryEmailTemplate",
value => $self->session->setting->get('webguiPasswordRecoveryEmailTemplate'),
label => $i18n->get('Password Recovery Email Template'),
hoverHelp => $i18n->get("password recovery email template help"),
namespace => "Auth/WebGUI/RecoveryEmail",
);
$f->template(
-name => "webguiWelcomeMessageTemplate",
-value => $self->session->setting->get("webguiWelcomeMessageTemplate"),
-namespace => "Auth/WebGUI/Welcome",
-label => $i18n->get("welcome message template"),
-hoverHelp => $i18n->get("welcome message template help")
$f->addField( "template",
name => "webguiWelcomeMessageTemplate",
value => $self->session->setting->get("webguiWelcomeMessageTemplate"),
namespace => "Auth/WebGUI/Welcome",
label => $i18n->get("welcome message template"),
hoverHelp => $i18n->get("welcome message template help")
);
$f->template(
-name => "webguiAccountActivationTemplate",
-value => $self->session->setting->get("webguiAccountActivationTemplate"),
-namespace => "Auth/WebGUI/Activation",
-label => $i18n->get("account activation template"),
-hoverHelp => $i18n->get("account activation template help")
$f->addField( "template",
name => "webguiAccountActivationTemplate",
value => $self->session->setting->get("webguiAccountActivationTemplate"),
namespace => "Auth/WebGUI/Activation",
label => $i18n->get("account activation template"),
hoverHelp => $i18n->get("account activation template help")
);
return $f->printRowsOnly;
return $f;
}
#-------------------------------------------------------------------

View file

@ -606,6 +606,14 @@ sub www_editSettings {
$output .= '</ul>';
}
# Start the form
my $tabform = WebGUI::FormBuilder->new($session, action => '?op=saveSettings' );
$tabform->addField( 'csrfToken', name => 'csrfToken' );
$tabform->addField( "hidden",
name => "op",
value => "saveSettings"
);
# Available tabs
# TODO: Build this from the definition instead.
tie my %tabs, 'Tie::IxHash', (
@ -619,25 +627,19 @@ sub www_editSettings {
auth => { label => $i18n->get("authentication") },
perms => { label => $i18n->get("permissions") },
);
# Start the form
my $tabform = WebGUI::TabForm->new($session,\%tabs);
$tabform->hidden({
name => "op",
value => "saveSettings"
});
for my $tabName ( keys %tabs ) {
$tabform->addTab( name => $tabName, %{$tabs{$tabName}} );
}
my $definitions = definition($session, $i18n);
foreach my $definition (@{$definitions}) {
$tabform->getTab($definition->{tab})->dynamicField(%{$definition});
$tabform->getTab($definition->{tab})->addField( $definition->{fieldType}, %$definition );
}
# Get fieldsets for avaiable auth methods
foreach (@{$session->config->get("authMethods")}) {
$tabform->getTab("auth")->fieldSetStart($_);
foreach my $authName (@{$session->config->get("authMethods")}) {
my $authInstance = WebGUI::Operation::Auth::getInstance($session,$_,1);
$tabform->getTab("auth")->raw($authInstance->editUserSettingsForm);
$tabform->getTab("auth")->fieldSetEnd;
$tabform->getTab( "auth" )->addFieldset( $authInstance->editUserSettingsForm, name => $authName, label => $authName );
}
# Get fieldsets for avaiable account methods
@ -660,20 +662,18 @@ sub www_editSettings {
}
#If editUserSettingsForm is empty, skip it
next if $settingsForm eq "";
next unless $settingsForm;
#Set the title of the fieldset
my $title = $account->{title};
WebGUI::Macro::process($title);
#Print the settings form for this account pluggin
$tabform->getTab("account")->fieldSetStart($title);
$tabform->getTab("account")->raw($settingsForm);
$tabform->getTab("account")->fieldSetEnd;
$tabform->getTab("account")->addFieldset( $settingsForm, name => $account->{identifier}, label => $title );
}
$tabform->submit();
$output .= $tabform->print;
$tabform->addField( "submit", name => "submit" );
$output .= $tabform->toHtml;
my $ac = WebGUI::AdminConsole->new($session,"settings");
return $ac->render($output);
@ -707,6 +707,7 @@ sub www_saveSettings {
my $authErrors = $authInstance->editUserSettingsFormSave;
if ($authErrors) {
$session->log->warn( "Problem saving settings: " . $authErrors );
push @errors, @{ $authErrors };
}
}

75
t/Operation/Settings.t Normal file
View file

@ -0,0 +1,75 @@
# vim:syntax=perl
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#------------------------------------------------------------------
# Write a little about what this script tests.
#
#
use FindBin;
use strict;
use lib "$FindBin::Bin/lib";
use Test::More;
use Test::Deep;
use WebGUI::Test; # Must use this before any other WebGUI modules
use WebGUI::Test::Mechanize;
use WebGUI::Session;
#----------------------------------------------------------------------------
# Init
my $session = WebGUI::Test->session;
#----------------------------------------------------------------------------
# Tests
#----------------------------------------------------------------------------
# Edit some settings up in here
my $mech = WebGUI::Test::Mechanize->new( config => WebGUI::Test->file );
$mech->get_ok( '/' );
$mech->session->user({ userId => 3 });
my %newSettings = (
# Test some normal settings
companyName => 'Shawshank Penetentiary',
companyEmail => 'warden@shawshank.justice.gov',
# Test some Auth settings
facebookAuthEnabled => 1,
ldapConnection => 'SOME_RANDOM_ID',
twitterEnabled => 1,
webguiPasswordLength => 9_001,
# Test some Account settings
overrideAbleToBeFriend => 1,
inboxInviteUserSubject => 'Your incarceration adventure begins here!',
);
$mech->get_ok( '/?op=editSettings' );
$mech->submit_form_ok({
fields => \%newSettings,
},
"Settings edited"
);
my $testSettings = $session->db->buildHashRef("select * from settings", [], {noOrder => 1});
cmp_deeply(
$testSettings,
superhashof( \%newSettings ),
"Settings are set",
);
diag $mech->content;
diag explain $testSettings;
done_testing;
#vim:ft=perl