История изменений
Исправление DRVTiny, (текущая версия) :
Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):
my $LCO=sub { die 'You must use "new" constructor' };
sub new {
my ($class,%Config)=@_;
my %Err;
my $dbg_=sub {
print STDERR @_,"\n" if $Config{'debug'};
};
my $doSetErr=sub {
my ($c,$m)=@_;
$dbg_->('Error[',$c,']: ',$m);
@Err{'code','msg'}=($c,$m);
};
my %methods=(
'debug'=>sub :lvalue {
my $v=lc(shift);
return $Config{'debug'} unless @_;
if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
$Config{'debug'}=$v
} else {
$doSetErr->(127,'Wrong value for "debug" property')
}
},
);
$LCO=bless sub {
my $method=shift;
die 'No such method: '.$method unless $methods{$method};
$methods{$method}->(@_);
},$class
}
Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!
Исправление DRVTiny, :
Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):
my $LCO=sub { die 'You must use "new" constructor' };
sub new {
my ($class,%Config)=@_;
my %Err;
my $dbg_=sub {
print STDERR @_,"\n" if $Config{'debug'};
};
my $doSetErr=sub {
my ($c,$m)=@_;
$dbg_->('Error[',$c,']: ',$m);
@Err{'code','msg'}=($c,$m);
};
my %methods=(
'debug'=>sub :lvalue {
my $v=lc(shift);
return $Config{'debug'} unless @_;
if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
$Config{'debug'}=$v
} else {
$doSetErr->(127,'Wrong value for "debug" property')
}
},
);
$LCO=bless sub {
my $method=shift;
die 'No such method: '. unless $methods{$method};
$methods{$method}->(@_);
},$class
}
Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!
Исправление DRVTiny, :
Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):
my $LCO=sub { die 'You must use "new" constructor' };
sub new {
my ($class,%Config)=@_;
my %Err;
my $dbg_=sub {
print STDERR @_,"\n" if $Config{'debug'};
}
my $doSetErr=sub {
my ($c,$m)=@_;
$dbg_->('Error[',$c,']: ',$m);
@Err{'code','msg'}=($c,$m);
}
my %methods=(
'debug'=>sub :lvalue {
my $v=lc(shift);
return $Config{'debug'} unless @_;
if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
$Config{'debug'}=$v
} else {
$doSetErr->(127,'Wrong value for "debug" property')
}
},
);
$LCO=bless sub {
my $method=shift;
die 'No such method: '. unless $methods{$method};
$methods{$method}->(@_);
},$class
}
Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!
Исходная версия DRVTiny, :
Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их декларировать «некрасивым образом», чтобы можно было использовать ранее, чем будет описано их «тело»:
my $LCO=sub { die 'You must use "new" constructor' };
sub new {
my ($class,%Config)=@_;
my %Err;
my $dbg_=sub {
print STDERR @_,"\n" if $Config{'debug'};
}
my $doSetErr=sub {
my ($c,$m)=@_;
$dbg_->('Error[',$c,']: ',$m);
@Err{'code','msg'}=($c,$m);
}
my %methods=(
'debug'=>sub :lvalue {
my $v=lc(shift);
return $Config{'debug'} unless @_;
if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
$Config{'debug'}=$v
} else {
$doSetErr->(127,'Wrong value for "debug" property')
}
},
);
$LCO=bless sub {
my $method=shift;
die 'No such method: '. unless $methods{$method};
$methods{$method}->(@_);
},$class
}
Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!