/lib/HTML/FormHandler/Moose.pm

http://github.com/gshank/html-formhandler · Perl · 81 lines · 61 code · 19 blank · 1 comment · 6 complexity · b2a5adcbcf761241e95f79608188feb6 MD5 · raw file

  1. package HTML::FormHandler::Moose;
  2. # ABSTRACT: to add FormHandler sugar
  3. use Moose;
  4. use Moose::Exporter;
  5. use Moose::Util::MetaRole;
  6. use HTML::FormHandler::Meta::Role;
  7. =head1 SYNOPSIS
  8. Enables the use of field specification sugar (has_field).
  9. Use this module instead of C< use Moose; >
  10. package MyApp::Form::Foo;
  11. use HTML::FormHandler::Moose;
  12. extends 'HTML::FormHandler';
  13. has_field 'username' => ( type => 'Text', ... );
  14. has_field 'something_else' => ( ... );
  15. no HTML::FormHandler::Moose;
  16. 1;
  17. =cut
  18. Moose::Exporter->setup_import_methods(
  19. with_meta => [ 'has_field', 'has_page', 'has_block', 'apply' ],
  20. also => 'Moose',
  21. );
  22. sub init_meta {
  23. my $class = shift;
  24. my %options = @_;
  25. Moose->init_meta(%options);
  26. my $meta = Moose::Util::MetaRole::apply_metaroles(
  27. for => $options{for_class},
  28. class_metaroles => {
  29. class => [ 'HTML::FormHandler::Meta::Role' ]
  30. }
  31. );
  32. return $meta;
  33. }
  34. sub has_field {
  35. my ( $meta, $name, %options ) = @_;
  36. my $names = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
  37. unless ($meta->found_hfh) {
  38. my @linearized_isa = $meta->linearized_isa;
  39. if( grep { $_ eq 'HTML::FormHandler' || $_ eq 'HTML::FormHandler::Field' } @linearized_isa ) {
  40. $meta->found_hfh(1);
  41. }
  42. else {
  43. die "Package '" . $linearized_isa[0] . "' uses HTML::FormHandler::Moose without extending HTML::FormHandler[::Field]";
  44. }
  45. }
  46. $meta->add_to_field_list( { name => $_, %options } ) for @$names;
  47. }
  48. sub has_page {
  49. my ( $meta, $name, %options ) = @_;
  50. my $names = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
  51. $meta->add_to_page_list( { name => $_, %options } ) for @$names;
  52. }
  53. sub has_block {
  54. my ( $meta, $name, %options ) = @_;
  55. $meta->add_to_block_list( { name => $name, %options } );
  56. }
  57. sub apply {
  58. my ( $meta, $arrayref ) = @_;
  59. $meta->add_to_apply_list( @{$arrayref} );
  60. }
  61. use namespace::autoclean;
  62. 1;