說,我有兩個作用:簡單::稅和房地產稅::。在測試情況下,我想使用Simple :: Tax,而在生產中,我想使用Real :: Tax。做這個的最好方式是什麼?我首先想到的是使用不同版本的new
方法來創建具有不同角色的對象:如何在穆斯處理嘲笑角色?
#!/usr/bin/perl
use warnings;
{
package Simple::Tax;
use Moose::Role;
requires 'price';
sub calculate_tax {
my $self = shift;
return int($self->price * 0.05);
}
}
{
package A;
use Moose;
use Moose::Util qw(apply_all_roles);
has price => (is => "rw", isa => 'Int'); #price in pennies
sub new_with_simple_tax {
my $class = shift;
my $obj = $class->new(@_);
apply_all_roles($obj, "Simple::Tax");
}
}
my $o = A->new_with_simple_tax(price => 100);
print $o->calculate_tax, " cents\n";
我的第二個想法是使用一個,如果在包體語句中使用不同的with
聲明:
#!/usr/bin/perl
use warnings;
{
package Complex::Tax;
use Moose::Role;
requires 'price';
sub calculate_tax {
my $self = shift;
#pretend this is more complex
return int($self->price * 0.15);
}
}
{
package Simple::Tax;
use Moose::Role;
requires 'price';
sub calculate_tax {
my $self = shift;
return int($self->price * 0.05);
}
}
{
package A;
use Moose;
has price => (is => "rw", isa => 'Int'); #price in pennies
if ($ENV{TEST_A}) {
with "Simple::Tax";
} else {
with "Complex::Tax";
}
}
my $o = A->new(price => 100);
print $o->calculate_tax, " cents\n";
是這些比其他的更好的,是有什麼可怕的關於任何一方的,並且是有沒有更好的辦法,我還沒想過呢。
所以,'各地calculate_tax'方法在簡單稅制的作用從來沒有實際調用對象的'calculate_tax'方法,對嗎?我認爲這是最乾淨的方式。 –
的確,您完全重寫了使用'around'替換它的父方法。 – perigrin