/[Frey]/trunk/lib/Frey/Action.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/Action.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 430 - (hide annotations)
Wed Nov 19 00:39:23 2008 UTC (15 years, 5 months ago) by dpavlin
File size: 4353 byte(s)
rewrite required fields to be more robust
1 dpavlin 369 package Frey::Action;
2     use Moose;
3     extends 'Frey::PPI';
4     with 'Frey::Web';
5     with 'Frey::Config';
6    
7 dpavlin 386 use Clone qw/clone/;
8 dpavlin 369 use Data::Dump qw/dump/;
9    
10     =head1 DESCRIPTION
11    
12     Invoke any L<Frey> object creating html for with various default parameters
13     if not supplied at invocation.
14    
15     =cut
16    
17     has 'class' => (
18     is => 'rw',
19     isa => 'Str',
20     required => 1,
21     );
22    
23     has 'params' => (
24     is => 'rw',
25     isa => 'HashRef',
26     default => sub { {} },
27     );
28    
29     =head2 required
30    
31     my @required_attributes = $self->required;
32     my $required_attributes = $self->required;
33    
34     =cut
35    
36     sub required {
37     my ( $self ) = @_;
38     $self->load_class( $self->class );
39     my @required =
40 dpavlin 430 grep { defined $_ }
41     map {
42     eval {
43     $_->can('name') && !defined( $self->params->{ $_->name } )
44     };
45     }
46 dpavlin 369 grep {
47 dpavlin 430 my $required = eval {
48     my $attr = $self->class->meta->get_attribute($_);
49     $attr->is_required;
50     };
51     warn "# attribute $_ error: $@" if $@;
52     $required;
53 dpavlin 369 } $self->class->meta->get_attribute_list;
54    
55 dpavlin 386 warn "## required = ",dump( map { $_->name } @required ), " for ", $self->class if @required && $self->debug;
56 dpavlin 369 return @required if wantarray;
57     return \@required;
58     }
59    
60     =head2 attributes
61    
62     Generated from attributes specified in code (extracted using L<Frey::PPI>)
63     and required atributes
64    
65     my @class_attributes = $self->attributes;
66     my @class_attributes = $self->attributes;
67    
68     =cut
69    
70     sub attributes {
71     my ( $self ) = @_;
72     my $a;
73     my @attrs = @{ $self->attribute_order };
74     @attrs = map { $a->{$_}++; $_ } @attrs;
75     push @attrs, $_ foreach grep { ! $a->{$_} } map { $_->name } @{ $self->required };
76 dpavlin 386 warn "# attributes = ",dump( @attrs ) if $self->debug;
77 dpavlin 369 return @attrs if wantarray;
78     return \@attrs;
79     }
80    
81     =head2 params_form
82    
83 dpavlin 386 my $html = $self->params_form;
84     my ($html,$default_params) = $self->params_form;
85 dpavlin 369
86     =cut
87    
88     sub params_form {
89     my ( $self ) = @_;
90     my @required = $self->required;
91     if ( ! @required ) {
92 dpavlin 414 warn "all params available ", dump( $self->params ), " not creating form" if $self->debug;
93 dpavlin 386 return (undef,$self->params) if wantarray;
94 dpavlin 369 return;
95     } else {
96 dpavlin 390 warn $self->class, " required params ", map { $_->dump(2) } @required if $self->debug;
97 dpavlin 369 }
98    
99     my $class = $self->class;
100    
101     $self->load_class( $class );
102    
103 dpavlin 386 my $default = clone $self->params; # XXX we really don't want to modify params!
104 dpavlin 369
105 dpavlin 386 my $config_params = {};
106     $config_params = $self->config($class);
107     warn "# $class config = ",dump( $config_params ) if $self->debug;
108 dpavlin 369
109 dpavlin 386 my $form;
110    
111 dpavlin 369 foreach my $name ( grep { ! $class->meta->get_attribute($_)->is_lazy } $self->attributes ) {
112 dpavlin 414 my $attr_type = '';
113 dpavlin 369 my $type = $name =~ m/^pass/ ? 'password' : 'text';
114 dpavlin 372 my $label = $name;
115 dpavlin 369 my $value = '';
116 dpavlin 372 my $label_title = '';
117 dpavlin 369 my $value_html = '';
118 dpavlin 386 if ( ref($config_params) eq 'HASH' ) {
119     $value = $config_params->{$name};
120     } elsif ( ref($config_params) eq 'ARRAY' ) {
121 dpavlin 369 $value_html = qq|<select name="$name">| . join("\n",
122     map {
123     my $v = $_->{$name};
124     qq|<option value="$v">$v</option>|
125 dpavlin 386 } @$config_params
126 dpavlin 369 ) . qq|</select>|;
127 dpavlin 386 $default->{$name} = $config_params->[0]->{$name};
128 dpavlin 369 } elsif ( my $attr = $class->meta->get_attribute( $name ) ) {
129 dpavlin 372 if ( $attr->has_type_constraint ) {
130 dpavlin 399 $attr_type = $attr->type_constraint->name;
131 dpavlin 372 if ( $attr->type_constraint->can('values') ) {
132     $value_html = qq|<select name="$name">| . join("\n",
133     map { qq|<option value="$_">$_</option>| } @{ $attr->type_constraint->values }
134     ) . qq|</select>|;
135     } elsif ( $attr_type !~ m{^(Str|Int)$} ) {
136     $value_html = qq|<textarea name="$name" title="$attr_type">$value</textarea>|;
137     }
138 dpavlin 369 }
139 dpavlin 372 $value = $attr->default( $name ) if ! $value && $attr->has_default;
140     $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;
141 dpavlin 369 } else {
142     warn "wired attribute $name";
143     }
144 dpavlin 372
145     $value_html = qq|<input type="$type" name="$name" title="$attr_type" value="$value">| unless $value_html;
146    
147 dpavlin 386 $default->{$name} = $value unless defined $default->{$name};
148    
149 dpavlin 369 # warn "# required $name ", $class->meta->get_attribute( $name )->dump( 2 );
150 dpavlin 386 $form .= qq|<label for="$name"$label_title>$label</label>| . $value_html;
151 dpavlin 369 }
152 dpavlin 390 my $html = qq|<h1>$class params</h1><form method="post">$form<input type="submit" value="Run $class"></form>|;
153     push @{ $self->status }, { 'Params' =>
154     {
155     'Config' => $config_params,
156     'Default' => $default
157     },
158     };
159 dpavlin 369
160 dpavlin 386 return ($html,$default) if wantarray;
161 dpavlin 369 return $html;
162     }
163    
164     1;

  ViewVC Help
Powered by ViewVC 1.1.26