[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