package example::BookStore::BookAgeProperty; use base qw(Xmldoom::Definition::Property::Simple); use DBIx::Romani::Query::SQL::TTT::Function; use DBIx::Romani::Query::SQL::TTT::Operator; use DBIx::Romani::Query::Function::Now; use Date::Calc qw( Today Date_to_Days ); use POSIX::strptime; use strict; sub get_data_type { my $self = shift; # TODO: this isn't right! There should be some way that hints is included # automatically, and options can be pretty much ignored. my %value = ( type => 'integer', options => $self->{options}, hints => $self->{hints} ); return \%value; } sub get { my ($self, $object) = @_; my ($year1,$month1,$day1) = Today(); my $today_days = Date_to_Days($year1,$month1,$day1); my ($sec2,$min2,$hour2,$day2,$month2,$year2,$tmp,$tmp) = POSIX::strptime( $object->_get_attr( "created" ), '%Y-%m-%d %H:%M:%S' ); my $created_days = Date_to_Days($year2+1900,$month2+1,$day2); return $today_days - $created_days; } sub set { my ($self, $object, $value) = @_; die "Cannot write the age property"; } sub get_query_lval { my $self = shift; my $today_days = DBIx::Romani::Query::SQL::TTT::Function->new('TO_DAYS'); $today_days->add( DBIx::Romani::Query::Function::Now->new() ); my $created_days = DBIx::Romani::Query::SQL::TTT::Function->new('TO_DAYS'); $created_days->add( DBIx::Romani::Query::SQL::Column->new( $self->{parent}->get_table_name(), 'created' ) ); my $age_op = DBIx::Romani::Query::SQL::TTT::Operator->new('-'); $age_op->add( $today_days ); $age_op->add( $created_days ); return [ $age_op ]; } 1;