давайе обсудим сложное ООП в perl
столкнулся с проблемой, не удобно использовать медоты когда очень много классов...
кто как использует ООП с «магической функцией» tie?
хочется увидеть на примере!
в книге было написано что это можно использовать, но я реально нигде не видел применение...
вы навренео видели что когда код занимает более 50 000 строк, то он фигово читается....
вот пример, но я не сильно понимаю как это применить, собственно...
какие еще есть примеры, в студию пожалуйста!!!
#Class.pm
package Property;
BEGIN {*UNTIE=*DESTROY}
sub TIESCALAR {
print "creating layer..\n";
my$self=\{};
# во имя отца и сына и святого духа, АдминЪ,
# благословляем объект
bless $self, $_[0];
if(defined $_[1]) {
$self->STORE($_[1]{-default}) if exists $_[1]{-default};
$$$self{-getter}=$_[1]{-getter} if exists $_[1]{-getter};
$$$self{-setter}=$_[1]{-setter} if exists $_[1]{-setter};
$$$self{-destroyer}=$_[1]{-destroyer} if exists $_[1]{-destroyer};
$$$self{-aftertie}=$_[1]{-aftertie} if exists $_[1]{-aftertie};
}
$$$self{-aftertie}($self, @_) if exists $$$self{-aftertie};
+$self
}
sub FETCH {
if(exists $${$_[0]}{-getter}) {
+$${$_[0]}{-getter}(@_)
} else {
print "getter called..\n";
+${+shift}
}
}
sub STORE {
if(exists $${$_[0]}{-setter}) {
+$${$_[0]}{-setter}(@_)
} else {
print "setter called..\n";
+${+$_[0]}=$_[1]
}
}
sub DESTROY {
if(exists $${$_[0]}{-destroyer}) {
+$${$_[0]}{-destroyer}(@_)
} else {
print "destroyer of worlds..\n";
+shift
}
}
package Class;
sub new {
my($class, $self)=(shift, {@_});
foreach(keys %{$self->{-properties}||={}}) {
tie $self->{$_}, Property, $self->{-properties}{$_};
print $_, "\n";
}
delete $self->{-properties};
+bless $self, $class;
}
+1
package Child;
use base qw(Class);
sub new {
+shift->SUPER::new(
-properties=>{
p1=>{
-default=>1,
-getter=>'Child::p1_getter'
#sub {
# print "Your getter\n";
# +${+shift}
#}
},
p2=>{
-default=>3,
-destroyer=>'Child::p2_destroyer'
#sub {
# print "Your destroyer\n";
#}
}
}
);
}
sub p1_getter {
#...
}
sub p2_destroyer {
#...
}
sub run {
print "Running...\n";
+shift
}
+1