(类似于,但更具体的细节,#11526999)
我的结果类是使用dbicdump
构建的,但我希望重载date
字段的默认访问器。
为了hackytest我的想法,我只是添加一个accessor
属性到date
调用创建的add_columns
键:
__PACKAGE__->add_columns(
"stamp_id",
{
data_type => "integer",
is_auto_increment => 1,
is_nullable => 0,
sequence => "timestamp_stamp_id_seq",
},
"date",
{ data_type => "date", is_nullable => 0, accessor => '_date' },
);
...并在Schema :: Loader校验和行下创建了我的访问器例程:
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA
sub date {
my $self = shift;
warn "overloaded date\n"; # Added for debugging
my $date;
# The date needs to be just the date, not the time
if ( @_ ) {
$date = shift;
if ( $date =~ /^([\d\-]+)/ ) {
$date = $1
}
return $self->_date($date)
}
# Fetch the column value & remove the time part.
$date = $self->_date;
if ( $date =~ /^([\d\-]+)/ ) {
$date = $1
}
return $date;
}
这是有效的,因为它返回预期的2014-10-04
,但是是一个躲避。
问题是我已经破解了校验和代码,所以我不能整齐地重新生成我的Class对象。
阅读ResultSource和CookBook正确的方法似乎是:
将dbicdump
构建的ResultSource作为标准:
__PACKAGE__->add_columns(
"stamp_id",
{
data_type => "integer",
is_auto_increment => 1,
is_nullable => 0,
sequence => "timestamp_stamp_id_seq",
},
"date",
{ data_type => "date", is_nullable => 0 },
);
....添加更改行下方的访问者,使用+
表示它是对现有定义的更改:
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA
__PACKAGE__->add_columns(
"+date", { accessor => '_date' },
);
....像以前一样使用重载方法
我已经仔细检查了我的拼写,我已经尝试过add_column
而不是add_columns
,我已经尝试将第二个add_columns
直接放在第一个 - 所有现在都可用....代码使用默认访问器,并返回2014-10-04T00:00:00
如何覆盖默认访问器,以便我可以使用自己的方法?
蒙蔽...
你需要的是一个col_accessor_map作为加载器选项传入。
col_accessor_map => {
table_name => {
date => _date,
}
}
您可以使用dbicdump将加载程序选项传递给-o
。
$ dbicdump -o col_accessor_map="{ table_name => { date => _date } }" ... other options ...
(将上面的table_name
替换为你的桌子名称 - 这很明显,对吧?)
更新:这是未经测试的,当我最终完成测试时,我发现它不起作用。在与IRC上的the author对话后,我被告知col_accessor_map
选项不支持这种嵌套哈希方法,所以如果你想使用这种方法,你需要使用coderef。
然而,作者也同意添加这种支持是一个好主意,我刚刚从午餐回来找到这个添加功能的Github commit。我不知道它会多快到达CPAN。
这可能是第一次更新CPAN以使SO答案正确:-)
在不同的抽象级别,我相信你可以使用方法修饰符
use Class::Method::Modifier; # or Moose/Moo
around date => sub {...};