There's nothing special about new() in Perl -- it's the same as any other method. You can override it, and you will have the same trials and tribulations with overriding it that you would have with any other inheritance scenario. It still sounds like you're complaining that you don't like OOP to me. | [reply] |
Well, I think it's a real problem for the dispatcher not to know the difference between abstract interface methods and infrastructural methods, which is why Perl 6 introduces the concept of "submethods" that are callable from outside the class,
but only if there's an exact type match on the invocant.
Otherwise the dispatcher keeps looking for a more appropriate method or submethod to dispatch to.
(There's also the concept of completely private methods that aren't visible from outside the class at all, but that's really a different beastie altogether.) Anyway, I think use of submethods would probably solve the first problem of the OP.
| [reply] |
I never said "don't override it", I even proposed two ways you could do it! This is a general situation: if you want to override method A so that it calls method B, and you know that method B will call method A, you can fix the loop by overriding method B. For example,
package MyApp::DBI;
use base 'Class::DBI';
__PACKAGE__->connection(...);
1;
package MyApp::Gallery;
use base 'MyApp::DBI';
__PACKAGE__->table('galleries');
__PACKAGE__->columns(...);
sub create {
my ($self, $ops) = @_;
my $dir = $ops->{'directory'};
if (-e $dir) {
die 'directory exists';
else {
mkdir $directory;
$self->find_or_create($data);
};
return;
};
sub find_or_create {
my $class = shift;
my $hash = ref $_[0] eq "HASH" ? shift: {@_};
my ($exists) = $class->search($hash);
return defined($exists) ? $exists $class->SUPER::create($hash)
+;
}
1;
| [reply] [d/l] |