Data::MuFormX::Registry - Registry of Form classes


Given some Data::MuForms in a common namespace:

    package MyApp::Form::Login;

    use Moo;
    use Data::MuForm::Meta;

    extends 'Data::MuForm';

    has_field 'username' => (
      type => 'Text',
      required => 1 );

    package MyApp::Form::Email;

    use Moo;
    use Data::MuForm::Meta;

    extends 'Data::MuForm';

    has_field 'username' => (
      type => 'Text',
      required => 1 );

Create a 'registry' object that will load a prepare all the forms:

    my $registry = Data::MuFormX::Registry->new(form_namespace=>'MyApp::Form');
    my $login = $registry->create('Login'); # $login ISA MyApp::Form::Login

You may also subclass for hardcoded defaults

    package MyApp::MyRegistry;

    use Moo;
    extends 'Data::MuFormX::Registry';


    # 'form_namespace defaults to 'MyApp::Form'
    my $registry = MyApp::MyRegistry->new;


NOTE Early access; the docs do not describe all existing features (read the source :) ) and I reserve the right to break stuff if that's the only way to fix deep problems. On the other hand there's not a ton of stuff here so its probably ok...

This is a wrapper on top of Module::Pluggable::Object to make it easier to load up and create a namespace of Data::MuForm based form validation classes. At its heart it makes it so you don't have to say 'use Form;' for every form you need in a package. It also adds a way to centralize some form initialization work. This may or may not recommend itself to you. I think it makes it easier to reuse forms in different packages (for example in different Mojolicous controllers). On the other hand it injects a proxy layer such that '$registry->create("Login")' is not 100% transparent in that you are getting an instance of 'MyApp::Form::Login'. You may consider this a type of action at a distance that makes your code harder to maintain.

If you have a lot of Data::MuForm based form validation classes you may find it more useful. I also believe it helps you follow the 'code against an interface not an class' best practice. As you wish ;)


This class exposes the follow methods for intended public use.


Create a new registry object. You can set the following initial arguments:


Either a scalar or array ref of the base namespaces used to find forms.


configuration values used when creating form objects.


Create a new form. Requires a form name. May accept a hash of additional initialization values (which are merged with any global configuration. Examples:

    my $transaction = $registry->create('Transaction');
    my $login = $registry->create('Login', user_rs=>$users);

If you do not need to pass any extra arguments we reuse a pre-initialized copy of the form rather than build a new one as a performance enhancement.


Returns an array of the form names, which can be used in "create". Do not rely on return order!


Global configuration information for all forms.

Intended to be overridden in a subclass to provide form defaults. For example:

    package MyRegistry;

    use Moo;
    extends 'Data::MuFormX::Registry';

    sub config {
      'Login' => + {
        min_username_length => 11,
      'NewNodes' => sub {
        my ($self) = @_;
        return +{
          example1 => 1,
          example2 => 1,

This method should return a hash where the key is the form name and the value is either a hashref used as part of the instantiation of the form or a coderef which recieves the registry instance and should return a hashref. The second form is useful in cases where you have a form that itself has other forms as subforms or when you custom subclass contains additional information of value to the form (such as a database connection).


John Napiorkowski


Data::MuForm, Module::Pluggable::Object


Copyright 2018, John Napiorkowski

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.