如何弃用基于Moose的类中的属性

时间:2013-10-26 17:34:13

标签: perl attributes deprecated moose

我有一个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


现在,此模块中唯一已知的userid_generator设置为代码引用,以有效地将其设置为将来的行为。
modified只能在我的模块的旧版本上执行此操作。 (尚未发布)

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

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

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

2 个答案:

答案 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::Internalwarnings::enabled,这些都是一个整洁的小包。