From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!perl
# vim:ft=perl:
package MyObject;
# For testing purposes
use Params::Validate qw(:types);
sub rt_type { 'myobject' }
sub _attributes {
{
id => {},
abc => {
validation => {
type => SCALAR,
},
},
}
}
sub retrieve {
my $self = shift;
$self->abc( $self->id );
$self->{__dirty} = {};
return $self;
}
my $i = 0;
sub store {
my $self = shift;
$::STORED = ++$i;
}
__PACKAGE__->_generate_methods;
package main;
use strict;
use vars qw($STORED);
use Test::More tests => 20;
my $obj = MyObject->new( id => 1 );
ok( !defined( $obj->abc ), "retrieve has not been called" );
$obj->retrieve;
ok( defined( $obj->abc ), "retrieve has been called" );
$obj->abc(1);
ok( 1 == $obj->abc, "attribute 'abc' set correctly" );
ok( 1 == $obj->_dirty, "one dirty attribute" );
ok( 'abc' eq ( $obj->_dirty )[0], "and that attribute is 'abc'" );
ok( !defined( MyObject->autostore ), "autostore is disabled by default" );
ok( !defined( MyObject->autosync ), "autosync is disabled by default" );
ok( !defined( MyObject->autoget ), "autoget is disabled by default" );
throws_ok {
MyObject->be_transparent(3);
}
'RT::Client::REST::Object::InvalidValueException';
my $rt = RT::Client::REST->new;
lives_ok {
MyObject->be_transparent($rt);
}
"made MyObject transparent";
ok( !defined( MyObject->autostore ), "autostore is still disabled" );
ok( MyObject->autosync, "autosync is now enabled" );
ok( MyObject->autoget, "autoget is now enabled" );
ok( $rt == MyObject->rt, "the class keeps track of rt object" );
ok(
!defined( RT::Client::REST::Object->autostore ),
"autostore is disabled in the parent class"
);
ok(
!defined( RT::Client::REST::Object->autosync ),
"autosync is disabled in the parent class"
);
ok(
!defined( RT::Client::REST::Object->autoget ),
"autoget is disabled in the parent class"
);
$obj = MyObject->new( id => 4 );
ok( $obj->abc == 4, "object auto-retrieved" );
my $stored = $STORED;
$obj->abc(5);
ok( $stored + 1 == $STORED, "object is stored" );
$stored = $STORED;
$obj->id(10);
ok( $stored == $STORED, "modifying 'id' did not trigger a store" );