3

我有一个基于Moose 的类,有几个要删除的属性。

我希望使用它们来生成弃用警告。
可能有一种禁用警告的方法。

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;
    }
  },
);

我已经删除了唯一id_generator被使用的地方。


现在,该模块唯一已知的用户id_generator设置为有效地将其设置为未来行为的代码参考。
我已将其修改为仅在旧版本的模块上执行此操作。( 还没上市 )

package Games::Lacuna::Client::RPC;
...
use Moose;

extends 'JSON::RPC::LWP';
...

has '+id_generator' => (
  default => sub{sub{1}},
);
4

2 回答 2

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")返回的内容。

于 2013-10-26T22:55:40.657 回答
3

这是另一种方法!使用MooseX:: 已弃用:-)

with "MooseX::Deprecated" => {
   attributes => [ "id_generator" ],
};

我写 MooseX::Deprecated 的灵感来自我之前对这个问题的回答。它将方法修饰符的应用、检查 init_args、摆弄%Carp::Internalandwarnings::enabled都封装在一个整洁的小包中。

于 2013-10-29T14:27:05.143 回答