2013-10-26 2 views
3

У меня есть 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.


Прямо сейчас единственный известный user этого модуля устанавливает id_generator кодового реф, который эффективно устанавливает его будущее поведение.
У меня есть modified это только для старых версий моего модуля. (Еще не выпущен)

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

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

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

Поздравляем с тем, что пользователь # 1337 переполнен стеком! вы 1337! –

ответ

3

Вот еще один способ сделать это! Используйте MooseX::Deprecated :-)

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

Я написал MooseX :: Устаревшие вдохновленные моим предыдущим ответом на этот вопрос. Он инкапсулирует применение модификаторов метода, проверяет init_args, возится с %Carp::Internal и warnings::enabled, все в один аккуратный маленький пакет.

+0

Причина, по которой я не принял ответа, заключается в том, что я хочу любой попытки изменить значение по умолчанию с помощью 'has '+ id_generator' => (default => sub {sub {1}});' также выдавать предупреждение, а я ждал возможности показать его. –

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").