1#!/usr/bin/perl 2 3use strict; 4use warnings; 5 6use Test::More; 7use Test::Moose; 8 9BEGIN { plan skip_all => 'Form::Sensible is broken at the moment' } 10 11use Test::Requires { 'Form::Sensible' => '0.11220' }; 12 13use Bread::Board; 14 15{ 16 package My::Model; 17 use Moose; 18 19 sub get_all_access_levels { 20 return ( 21 { id => 'standard', name => 'Standard User' }, 22 { id => 'admin', name => 'Administrator' }, 23 { id => 'super', name => 'Super User' }, 24 ) 25 } 26} 27 28my $FormBuilder = container 'FormBuilder' => [ 'Fields' ] => as { 29 service 'Form' => ( 30 class => 'Form::Sensible', 31 block => sub { 32 my $s = shift; 33 my $c = $s->parent; 34 my $fields = $c->get_sub_container('Fields'); 35 my $form = Form::Sensible::Form->new( name => $s->param('name') ); 36 foreach my $name ( $fields->get_service_list ) { 37 $form->add_field( 38 $fields->get_service( $name )->get 39 ); 40 } 41 42 if ( my $state = $s->param('state') ) { 43 $form->set_values( $state ); 44 } 45 46 $form; 47 }, 48 parameters => { 49 name => { isa => 'Str' }, 50 state => { isa => 'HashRef', optional => 1 }, 51 } 52 ); 53}; 54 55my $Fields = container 'Fields' => [ 'Model' ] => as { 56 57 service 'Username' => ( 58 class => 'Form::Sensible::Field::Text', 59 block => sub { 60 Form::Sensible::Field::Text->new( 61 name => 'username', 62 validation => { regex => qr/^[0-9a-z]*$/ } 63 ); 64 } 65 ); 66 67 service 'Password' => ( 68 class => 'Form::Sensible::Field::Text', 69 block => sub { 70 Form::Sensible::Field::Text->new( 71 name => 'password', 72 render_hints => { 73 'HTML' => { 74 field_type => 'password' 75 } 76 } 77 ); 78 } 79 ); 80 81 service 'Submit' => ( 82 class => 'Form::Sensible::Field::Trigger', 83 block => sub { 84 Form::Sensible::Field::Trigger->new( 85 name => 'submit' 86 ); 87 } 88 ); 89 90 service 'AccessLevel' => ( 91 class => 'Form::Sensible::Field::Select', 92 block => sub { 93 my $s = shift; 94 my $select = Form::Sensible::Field::Select->new( 95 name => 'access_level', 96 ); 97 foreach my $access_level ( $s->param('schema')->get_all_access_levels ) { 98 $select->add_option( 99 $access_level->{id}, 100 $access_level->{name} 101 ); 102 } 103 $select; 104 }, 105 dependencies => { 106 schema => depends_on('Model/schema') , 107 }, 108 ); 109 110}; 111 112# this would actually wrap the 113# $c->model('DBIC') or something 114# in order to get the DBIC schema 115# object 116my $Model = container 'Model' => as { service 'schema' => My::Model->new }; 117 118# perhaps create this in a early part 119# of a catalyst dispatch chain 120my $Form = $FormBuilder->create( 121 Fields => $Fields->create( 122 Model => $Model 123 ) 124); 125 126# then in the actual action code 127# you would create the form instance 128# and pass the state (which is 129# basically $c->req->parameters) 130my $f = $Form->resolve( 131 service => 'Form', 132 parameters => { 133 name => 'test', 134 state => { 135 username => 'stevan', 136 password => '****', 137 access_level => [ 'admin' ] 138 } 139 } 140); 141isa_ok($f, 'Form::Sensible::Form'); 142 143my $result = $f->validate; 144 145ok( $result->is_valid, '... our form validated' ); 146 147 148done_testing; 149