我有一个Moose based class,其中包含一些我要删除的属性。
我希望使用它们来生成弃用警告 可能有一种方法可以禁用警告。
package JSON::RPC::LWP;
...
use Moose;
...
has previous_id => (
is => 'ro',
isa => JSONValue,
init_arg => undef,
writer => '_previous_id',
predicate => 'has_previous_id',
clearer => 'clear_previous_id',
);
# default id generator is a simple incrementor
my $default_id_gen = sub{
my($self,$prev) = @_;
$prev ||= 0;
return $prev + 1;
};
has id_generator => (
is => 'rw',
isa => 'Maybe[CodeRef]',
default => sub{ $default_id_gen },
trigger => sub{
my($self,$coderef) = @_;
unless( $coderef ){
$self->{id_generator} = $default_id_gen;
}
},
);
我已经removed the only place id_generator
was used。
现在,此模块中唯一已知的user将id_generator
设置为代码引用,以有效地将其设置为将来的行为。
我modified只能在我的模块的旧版本上执行此操作。 (尚未发布)
package Games::Lacuna::Client::RPC;
...
use Moose;
extends 'JSON::RPC::LWP';
...
has '+id_generator' => (
default => sub{sub{1}},
);
答案 0 :(得分:3)
您可以在访问者上设置方法修饰符:
before id_generator => sub
{
require Carp;
Carp::carp("The id_generator method is deprecated; called");
};
如果将警告传递给构造函数
,也可以发出警告after BUILD => sub
{
my ($self, $params) = @_;
if ($params->{id_generator})
{
require Carp;
Carp::carp("The id_generator parameter to the constructor is deprecated; given");
}
};
是的,执行此操作的MooseX模块会很不错。
有关可禁用的警告,请查看perldoc warnings
;特别注意warnings::enabled("deprecated")
返回的内容。
答案 1 :(得分:3)
这是另一种方法!使用MooseX::Deprecated: - )
with "MooseX::Deprecated" => {
attributes => [ "id_generator" ],
};
我写了MooseX :: Deprecated的灵感来自我之前对这个问题的回答。它封装了方法修饰符的应用,检查了init_args,摆弄了%Carp::Internal
和warnings::enabled
,这些都是一个整洁的小包。