/[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 715 - (hide annotations)
Thu Dec 4 17:33:39 2008 UTC (15 years, 4 months ago) by dpavlin
File size: 5157 byte(s)
hide _private attributes
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 435 grep {
41 dpavlin 469 defined $_ && $_->can('name') &&
42     ! defined( $self->params->{ $_->name } ) &&
43     ! $_->is_lazy
44 dpavlin 435 }
45 dpavlin 430 map {
46 dpavlin 435 my $attr = $self->class->meta->get_attribute($_);
47 dpavlin 440 blessed $attr && $attr->is_required && $attr;
48 dpavlin 369 } $self->class->meta->get_attribute_list;
49    
50 dpavlin 386 warn "## required = ",dump( map { $_->name } @required ), " for ", $self->class if @required && $self->debug;
51 dpavlin 369 return @required if wantarray;
52     return \@required;
53     }
54    
55     =head2 attributes
56    
57     Generated from attributes specified in code (extracted using L<Frey::PPI>)
58     and required atributes
59    
60     my @class_attributes = $self->attributes;
61     my @class_attributes = $self->attributes;
62    
63     =cut
64    
65     sub attributes {
66     my ( $self ) = @_;
67     my $a;
68     my @attrs = @{ $self->attribute_order };
69     @attrs = map { $a->{$_}++; $_ } @attrs;
70     push @attrs, $_ foreach grep { ! $a->{$_} } map { $_->name } @{ $self->required };
71 dpavlin 386 warn "# attributes = ",dump( @attrs ) if $self->debug;
72 dpavlin 369 return @attrs if wantarray;
73     return \@attrs;
74     }
75    
76     =head2 params_form
77    
78 dpavlin 386 my $html = $self->params_form;
79     my ($html,$default_params) = $self->params_form;
80 dpavlin 369
81     =cut
82    
83     sub params_form {
84     my ( $self ) = @_;
85     my @required = $self->required;
86     if ( ! @required ) {
87 dpavlin 414 warn "all params available ", dump( $self->params ), " not creating form" if $self->debug;
88 dpavlin 386 return (undef,$self->params) if wantarray;
89 dpavlin 369 return;
90     } else {
91 dpavlin 390 warn $self->class, " required params ", map { $_->dump(2) } @required if $self->debug;
92 dpavlin 369 }
93    
94     my $class = $self->class;
95    
96     $self->load_class( $class );
97    
98 dpavlin 386 my $default = clone $self->params; # XXX we really don't want to modify params!
99 dpavlin 369
100 dpavlin 386 my $config_params = {};
101     $config_params = $self->config($class);
102     warn "# $class config = ",dump( $config_params ) if $self->debug;
103 dpavlin 369
104 dpavlin 386 my $form;
105    
106 dpavlin 504 sub select_values {
107     my ( $name, $attr_type, $values ) = @_;
108     my $options = join("\n",
109     map {
110     my $v = ref($_) eq 'HASH' ? $_->{$name} : $_;
111     qq|<option value="$v">$v</option>| if $v;
112     } @$values
113     );
114     qq|<select title="$attr_type" name="$name">$options</select>| if $options;
115     }
116    
117 dpavlin 645 foreach my $checkbox ( split(/\s+/, $default->{'frey-checkboxes'} ) ) {
118     next if defined $default->{ $checkbox };
119    
120     $default->{ $checkbox } = 0;
121     $self->params->{ $checkbox } = 0;
122     warn "# checkbox $checkbox not ticked";
123     }
124    
125     my @checkboxes;
126    
127     foreach my $name (
128     grep {
129     ! $class->meta->get_attribute($_)->is_lazy
130     && ! defined $default->{$_}
131 dpavlin 715 && ! m{^_} # skip _private
132 dpavlin 645 } $self->attributes
133     ) {
134 dpavlin 414 my $attr_type = '';
135 dpavlin 369 my $type = $name =~ m/^pass/ ? 'password' : 'text';
136 dpavlin 372 my $label = $name;
137     my $label_title = '';
138 dpavlin 369 my $value_html = '';
139 dpavlin 504
140     my $attr = $class->meta->get_attribute( $name );
141     $attr_type = $attr->type_constraint->name if $attr->has_type_constraint;
142    
143 dpavlin 645 my $value =
144     defined $default->{$name} ? $default->{$name} :
145     $attr->has_default ? $attr->default( $name ) :
146     '';
147 dpavlin 510
148 dpavlin 386 if ( ref($config_params) eq 'HASH' ) {
149     $value = $config_params->{$name};
150     } elsif ( ref($config_params) eq 'ARRAY' ) {
151 dpavlin 504 $value_html = select_values( $name, $attr_type, $config_params );
152 dpavlin 386 $default->{$name} = $config_params->[0]->{$name};
153 dpavlin 504 } elsif ( $attr->has_type_constraint && $attr->type_constraint->can('values') ) {
154     $value_html = select_values( $name, $attr_type, $attr->type_constraint->values );
155 dpavlin 640 } elsif ( $attr_type =~ m{^Bool} ) {
156     my $suffix = '';
157     $suffix = ' checked' if $value;
158     $value_html = qq|<input type="checkbox" name="$name" title="$attr_type" value="$value"$suffix>|;
159 dpavlin 645 push @checkboxes, $name;
160 dpavlin 708 } elsif ( $attr_type !~ m{^(Str|Int)$} || $value =~ $Frey::Web::re_html ) {
161 dpavlin 504 $value_html = qq|<textarea name="$name" title="$attr_type">$value</textarea>|;
162 dpavlin 369 }
163 dpavlin 509
164 dpavlin 504 $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;
165 dpavlin 372
166 dpavlin 469 $default->{$name} = $value unless defined $default->{$name};
167    
168 dpavlin 640 $value_html = qq|<input type="$type" name="$name" title="$attr_type" value="$value">| unless $value_html;
169 dpavlin 372
170 dpavlin 369 # warn "# required $name ", $class->meta->get_attribute( $name )->dump( 2 );
171 dpavlin 386 $form .= qq|<label for="$name"$label_title>$label</label>| . $value_html;
172 dpavlin 369 }
173 dpavlin 645 $form .= qq|<input type="hidden" name="frey-checkboxes" value="| . join(' ', @checkboxes) . qq|">| if @checkboxes;
174    
175     my $html;
176    
177     $html = qq|
178     <h1>$class params</h1>
179     <form method="post">
180     $form
181     <input type="submit" value="Run $class">
182     </form>
183     | if $form;
184    
185 dpavlin 507 $self->add_status({
186 dpavlin 595 $self->class => {
187 dpavlin 469 params => $self->params,
188     config_params => $config_params,
189     default => $default
190 dpavlin 390 },
191 dpavlin 507 });
192 dpavlin 369
193 dpavlin 386 return ($html,$default) if wantarray;
194 dpavlin 369 return $html;
195     }
196    
197     1;

  ViewVC Help
Powered by ViewVC 1.1.26