package Fallery::Model::Rose::MakeMethods::Storable;

use strict;

use Carp();
use Storable;

use Rose::Object::MakeMethods;
our @ISA = qw(Rose::Object::MakeMethods);

use Rose::DB::Object::Constants qw(STATE_LOADING STATE_SAVING);

use Rose::DB::Object::Util qw(column_value_formatted_key is_loading is_saving);

our $VERSION = '0.01';

sub storable {
   my ( $class, $name, $args ) = @_;

   my $key       = $args->{'hash_key'}  || $name;
   my $interface = $args->{'interface'} || 'get_set';
   my $formatted_key = column_value_formatted_key($key);

   my %methods;

   if ( $interface eq 'get_set' ) {
      $methods{$name} = sub {
         my $self = shift;

         my $db = $self->db or die "Missing Rose::DB object attribute";
         my $driver = $db->driver || 'unknown';

         if (@_) {
            if ( is_loading($self) ) {
               $self->{$key} = undef;
               $self->{ $formatted_key, $driver } = $_[0];
            }
            else {
               $self->{$key} = $_[0];
               $self->{ $formatted_key, $driver } = undef;
            }
         }

         if ( is_saving($self) ) {
            if ($self->{ $formatted_key, $driver }) {
               return $self->{ $formatted_key, $driver };
            } elsif ($self->{$key}) {
               $self->{ $formatted_key, $driver } = freeze( $self->{$key} );
            } else {
               $self->{ $formatted_key, $driver } = undef;
            }
            return $self->{ $formatted_key, $driver };
         }

         if (!$self->{$key} && $self->{ $formatted_key, $driver }) {
            $self->{$key} = thaw( $self->{ $formatted_key, $driver } );
         }

         return $self->{$key};
      };
   }
   else { Carp::croak "Unknown interface: $interface" }

   return \%methods;
}

sub freeze {
#    Carp::carp "Freeze called!!!!";
   return Storable::freeze($_[0]);
}

sub thaw {
#    Carp::carp "Thaw called!!!!";
   return Storable::thaw($_[0]);
}

1;

__END__



