[Jifty-commit] r999 - in Jifty-DBI/trunk: lib/Jifty/DBI
jifty-commit at lists.jifty.org
jifty-commit at lists.jifty.org
Fri May 5 16:10:05 EDT 2006
Author: ewilhelm
Date: Fri May 5 16:09:21 2006
New Revision: 999
Modified:
Jifty-DBI/trunk/ (props changed)
Jifty-DBI/trunk/lib/Jifty/DBI/Record.pm
Log:
r159 at mjolnir: ewilhelm | 2006-04-12 01:28:50 -0700
lib/Jifty/DBI/Record.pm - catch attempts to set a refers_to
Modified: Jifty-DBI/trunk/lib/Jifty/DBI/Record.pm
==============================================================================
--- Jifty-DBI/trunk/lib/Jifty/DBI/Record.pm (original)
+++ Jifty-DBI/trunk/lib/Jifty/DBI/Record.pm Fri May 5 16:09:21 2006
@@ -88,6 +88,113 @@
}
+sub AUTOLOAD {
+ my $self = $_[0];
+
+ $self->_init_columns() unless $self->COLUMNS;
+
+ my ( $column_name, $action ) = $self->_parse_autoload_method($AUTOLOAD);
+
+ unless ( $action and $column_name ) {
+ my ( $package, $filename, $line ) = caller;
+ die "$AUTOLOAD Unimplemented in $package. ($filename line $line) \n";
+ }
+
+ my $column = $self->column($column_name);
+
+ unless ($column) {
+ my ( $package, $filename, $line ) = caller;
+ die "$AUTOLOAD Unimplemented in $package. ($filename line $line) \n";
+ }
+
+ no strict 'refs'; # We're going to be defining subs
+ if ( $action eq 'read' ) {
+ return '' unless $column->readable;
+
+ if ( UNIVERSAL::isa( $column->refers_to, "Jifty::DBI::Record" ) ) {
+ *{$AUTOLOAD} = sub {
+ $_[0]->_to_record( $column_name,
+ $_[0]->__value($column_name) );
+ };
+ } elsif (
+ UNIVERSAL::isa( $column->refers_to, "Jifty::DBI::Collection" ) )
+ {
+ *{$AUTOLOAD} = sub { $_[0]->_collection_value($column_name) };
+ } else {
+ *{$AUTOLOAD} = sub { return ( $_[0]->_value($column_name) ) };
+ }
+ goto &$AUTOLOAD;
+ } elsif ( $action eq 'write' ) {
+ return ( 0, 'Immutable column' ) unless $column->writable;
+
+ if ( UNIVERSAL::isa( $column->refers_to, "Jifty::DBI::Record" ) ) {
+ *{$AUTOLOAD} = sub {
+ my $self = shift;
+ my $val = shift;
+
+ $val = $val->id
+ if UNIVERSAL::isa( $val, 'Jifty::DBI::Record' );
+ return (
+ $self->_set( column => $column_name, value => $val ) );
+ };
+ } elsif (
+ UNIVERSAL::isa( $column->refers_to, "Jifty::DBI::Collection" ) )
+ { # XXX elw: collections land here
+ *{$AUTOLOAD} = sub {
+ # use YAML; die 'column: ', YAML::Dump($column), " ";
+ die "cannot write to referenced column";
+ };
+ } else {
+ *{$AUTOLOAD} = sub {
+ return (
+ $_[0]->_set( column => $column_name, value => $_[1] ) );
+ };
+ }
+ goto &$AUTOLOAD;
+ } elsif ( $action eq 'validate' ) {
+ *{$AUTOLOAD}
+ = sub { return ( $_[0]->_validate( $column_name, $_[1] ) ) };
+ goto &$AUTOLOAD;
+ }
+
+ else {
+ my ( $package, $filename, $line ) = caller;
+ die "$AUTOLOAD Unimplemented in $package. ($filename line $line) \n";
+ }
+
+}
+
+=head2 _parse_autoload_method $AUTOLOAD
+
+Parses autoload methods and attempts to determine if they're
+set, get or validate calls.
+
+Returns a tuple of (COLUMN_NAME, ACTION);
+
+=cut
+
+sub _parse_autoload_method {
+ my $self = shift;
+ my $method = shift;
+
+ my ( $column_name, $action );
+
+ if ( $method =~ /^.*::set_(\w+)$/o ) {
+ $column_name = $1;
+ $action = 'write';
+ } elsif ( $method =~ /^.*::validate_(\w+)$/o ) {
+ $column_name = $1;
+ $action = 'validate';
+
+ } elsif ( $method =~ /^.*::(\w+)$/o ) {
+ $column_name = $1;
+ $action = 'read';
+
+ }
+ return ( $column_name, $action );
+
+}
+
=head2 _accessible COLUMN ATTRIBUTE
Private method.
More information about the Jifty-commit
mailing list