【问题标题】:How do I deprecate an attribute in a Moose based class如何弃用基于 Moose 的类中的属性
【发布时间】:2013-10-26 17:34:13
【问题描述】:

我有一个Moosebased 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}},
);

【问题讨论】:

  • 恭喜你成为 #1337 堆栈溢出用户!你是1337!

标签: perl attributes deprecated moose


【解决方案1】:

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

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

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

【讨论】:

  • 我没有接受答案的原因是我希望尝试使用has '+id_generator' => ( default => sub{sub{1}}); 修改默认值以产生警告,我正在等待出现警告的可能性。
【解决方案2】:

您可以在访问器上设置方法修饰符:

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

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2012-03-22
    • 2013-09-02
    • 2023-03-31
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多