[Jifty-commit] r894 - in jifty/branches/jifty-jsan: lib/Jifty/Action
jifty-commit at lists.jifty.org
jifty-commit at lists.jifty.org
Sat Apr 22 17:31:08 EDT 2006
Author: trs
Date: Sat Apr 22 17:31:08 2006
New Revision: 894
Modified:
jifty/branches/jifty-jsan/ (props changed)
jifty/branches/jifty-jsan/lib/Jifty/Action/Record.pm
Log:
r9906 at zot (orig r889): jesse | 2006-04-21 23:53:31 -0400
r11768 at hualien: jesse | 2006-04-21 23:52:55 -0400
* Have Jifty::Action::Records cache their arguments
Modified: jifty/branches/jifty-jsan/lib/Jifty/Action/Record.pm
==============================================================================
--- jifty/branches/jifty-jsan/lib/Jifty/Action/Record.pm (original)
+++ jifty/branches/jifty-jsan/lib/Jifty/Action/Record.pm Sat Apr 22 17:31:08 2006
@@ -21,7 +21,7 @@
use base qw/Jifty::Action/;
-__PACKAGE__->mk_accessors(qw(record));
+__PACKAGE__->mk_accessors(qw(record _cached_arguments));
=head1 METHODS
@@ -95,134 +95,148 @@
=cut
-# XXX TODO should this be memoized?
sub arguments {
- my $self = shift;
+ my $self = shift;
+ unless ( $self->_cached_arguments ) {
my $field_info = {};
my @fields = $self->possible_fields;
# we use a while here because we may be modifying the fields on the fly.
while ( my $field = shift @fields ) {
- my $info = {};
- my $column;
- if (ref $field) {
- $column = $field;
- $field = $column->name;
- } else {
- $column = $self->record->column($field);
- my $current_value = $self->record->$field;
-
- # If the current value is actually a pointer to another object, dereference it
- $current_value = $current_value->id
- if ref($current_value) and $current_value->isa( 'Jifty::Record' );
- $info->{default_value} = $current_value if $self->record->id;
- }
-
- if ( defined $column->valid_values && $column->valid_values ) {
- $info->{valid_values} = [ @{$column->valid_values } ];
- $info->{render_as} = 'Select';
- }
- elsif ( defined $column->type && $column->type =~ /^bool/i ) {
- $info->{render_as} = 'Checkbox';
- }
- elsif (defined $column->render_as
- && $column->render_as =~ /^password$/i) {
- my $same = sub {
- my ($self, $value) = @_;
- if ( $value ne $self->argument_value($field) ) {
- return $self->validation_error($field . '_confirm' => "The passwords you typed didn't match each other.");
- } else {
- return $self->validation_ok($field . '_confirm');
- }
- };
-
- $field_info->{$field . "_confirm"} = {render_as => 'Password', validator => $same, mandatory => 0};
- }
-
- elsif ( defined $column->refers_to ) {
- my $refers_to = $column->refers_to;
- if ( ref($refers_to) and $refers_to->isa( 'Jifty::Record' ) ) {
-
- my $collection = Jifty::Collection->new(
- record_class => $refers_to,
- current_user => $self->record->current_user
- );
- $collection->unlimit;
-
- # XXX This assumes a ->name and a ->id method
- $info->{valid_values} = [
- { display_from => 'name',
- value_from => 'id',
- collection => $collection
- }
- ];
-
- $info->{render_as} = 'Select';
+ my $info = {};
+ my $column;
+ if ( ref $field ) {
+ $column = $field;
+ $field = $column->name;
+ }
+ else {
+ $column = $self->record->column($field);
+ my $current_value = $self->record->$field;
+
+# If the current value is actually a pointer to another object, dereference it
+ $current_value = $current_value->id
+ if ref($current_value)
+ and $current_value->isa('Jifty::Record');
+ $info->{default_value} = $current_value if $self->record->id;
+ }
+
+ if ( defined $column->valid_values && $column->valid_values ) {
+ $info->{valid_values} = [ @{ $column->valid_values } ];
+ $info->{render_as} = 'Select';
+ }
+ elsif ( defined $column->type && $column->type =~ /^bool/i ) {
+ $info->{render_as} = 'Checkbox';
+ }
+ elsif ( defined $column->render_as
+ && $column->render_as =~ /^password$/i )
+ {
+ my $same = sub {
+ my ( $self, $value ) = @_;
+ if ( $value ne $self->argument_value($field) ) {
+ return $self->validation_error( $field
+ . '_confirm' =>
+ "The passwords you typed didn't match each other." );
+ }
+ else {
+ return $self->validation_ok( $field . '_confirm' );
+ }
+ };
+
+ $field_info->{ $field . "_confirm" } = {
+ render_as => 'Password',
+ validator => $same,
+ mandatory => 0
+ };
+ }
+
+ elsif ( defined $column->refers_to ) {
+ my $refers_to = $column->refers_to;
+ if ( ref($refers_to) and $refers_to->isa('Jifty::Record') ) {
+
+ my $collection = Jifty::Collection->new(
+ record_class => $refers_to,
+ current_user => $self->record->current_user
+ );
+ $collection->unlimit;
+
+ # XXX This assumes a ->name and a ->id method
+ $info->{valid_values} = [
+ { display_from => 'name',
+ value_from => 'id',
+ collection => $collection
}
- }
+ ];
- # build up a validator sub if the column implements validation
- if ( defined $column->validator && $column->validator ) {
- $info->{ajax_validates} = 1;
- $info->{validator} = sub {
- my $self = shift;
- my $value = shift;
- my ( $is_valid, $message )
- = &{ $column->validator }( $self->record, $value );
- if ($is_valid) {
- return $self->validation_ok($field);
- }
- else {
- unless ($message) {
- $self->log->error(
- qq{_Schema validator for $field didn't explain why the value '$value' is invalid}
- );
- }
- return (
- $self->validation_error(
- $field => $message
- || q{That doesn't look right, but I don't know why}
- )
- );
- }
- };
- }
-
- my $autocomplete_method = "autocomplete_".$field;
- if ($self->record->can($autocomplete_method) ) {
- $info->{'autocompleter'} ||= sub {
- my($self, $value) = @_;
- return $self->record->$autocomplete_method( $value);
- };
+ $info->{render_as} = 'Select';
}
+ }
- my $canonicalize_method = "canonicalize_".$field;
- if ($self->record->can($canonicalize_method) ) {
- $info->{'canonicalizer'} ||= sub {
- my($self, $value) = @_;
- return $self->record->$canonicalize_method( $value );
- };
- } elsif (defined $column->render_as and $column->render_as eq "Date") {
- $info->{'canonicalizer'} ||= sub {
- my($self, $value) = @_;
- return _canonicalize_date($self, $value );
- };
- }
+ # build up a validator sub if the column implements validation
+ if ( defined $column->validator && $column->validator ) {
+ $info->{ajax_validates} = 1;
+ $info->{validator} = sub {
+ my $self = shift;
+ my $value = shift;
+ my ( $is_valid, $message )
+ = &{ $column->validator }( $self->record, $value );
+ if ($is_valid) {
+ return $self->validation_ok($field);
+ }
+ else {
+ unless ($message) {
+ $self->log->error(
+ qq{_Schema validator for $field didn't explain why the value '$value' is invalid}
+ );
+ }
+ return (
+ $self->validation_error(
+ $field => $message
+ || q{That doesn't look right, but I don't know why}
+ )
+ );
+ }
+ };
+ }
+
+ my $autocomplete_method = "autocomplete_" . $field;
+ if ( $self->record->can($autocomplete_method) ) {
+ $info->{'autocompleter'} ||= sub {
+ my ( $self, $value ) = @_;
+ return $self->record->$autocomplete_method($value);
+ };
+ }
+
+ my $canonicalize_method = "canonicalize_" . $field;
+ if ( $self->record->can($canonicalize_method) ) {
+ $info->{'canonicalizer'} ||= sub {
+ my ( $self, $value ) = @_;
+ return $self->record->$canonicalize_method($value);
+ };
+ }
+ elsif ( defined $column->render_as
+ and $column->render_as eq "Date" )
+ {
+ $info->{'canonicalizer'} ||= sub {
+ my ( $self, $value ) = @_;
+ return _canonicalize_date( $self, $value );
+ };
+ }
+ # If we're hand-coding a render_as, hints or label, let's use it.
+ for (qw(render_as label hints length mandatory sort_order)) {
- # If we're hand-coding a render_as, hints or label, let's use it.
- for ( qw(render_as label hints length mandatory sort_order)) {
-
- if ( defined $column->$_ ) {
- $info->{$_} = $column->$_;
- }
+ if ( defined $column->$_ ) {
+ $info->{$_} = $column->$_;
}
- $field_info->{$field} = $info;
+ }
+ $field_info->{$field} = $info;
}
- return $field_info;
+ $self->_cached_arguments($field_info);
+ }
+ return $self->_cached_arguments();
}
=head2 possible_fields
More information about the Jifty-commit
mailing list