1 2 3 4 5 6 7 8 9 10 11
package My_Module; use Anderes::Modul; sub new { my $class = shift; my $self = bless {}, $class; my ( $opt ) = @_; $self->Anderes::Modul::_validate_and_add_opt( $opt ); return $self; }
Guest gast_kuerbisGerade das spricht für ein eigenes Untermodul. Denn sonst lädst Du in My_Module jedes Mal das gesamte Anderes::ModulIch bräuchte nur diese Methode, ...
Guest gast_kuerbisEs gibt einen kleinen Unterschied: Mit dieser Aufrufsyntax hast Du die Möglichkeit, _validate_and_add_opt aus Anderes::Modul in Deinen Namensraum zu importieren.Wegen dem Unterstrich - beide Module habe ich selbst geschrieben.
Eventuell könnte ich Anderes::Modul::_validate_and_add_opt( $self, $opt ); schreiben, aber ich vermute, das ist auch nicht besser?
Guest gast_kuerbisBei Deiner Lösung musst Du auch bei jedem Bedarf Anderes::Modul laden. Du sparst Dir das Laden nur bei Anderes::Modul selbst!Nur für diese Methode ein eigenes Unter-Modul zu schreiben und das bei jeden Bedarf zu laden, wirkt auch mich zu umständlich.
QuoteEventuell könnte ich Anderes::Modul::_validate_and_add_opt( $self, $opt ); schreiben, aber ich vermute, das ist auch nicht besser?
$self->Anderes::Modul::_validate_and_add_opt( $opt );
Anderes::Modul::_validate_and_add_opt( $opt );
my ( $opt ) = @_;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# Filename validate_options.pm use strict; use warnings; use Carp; sub validate_options{ my $self = shift; my $valid = shift; # hasref valide key's my $opt = shift; # hashref Options return if ! defined $opt; my $sub = ( caller( 1 ) )[3]; $sub =~ s/^.+::(?:__)?([^:]+)\z/$1/; $sub .= ':'; for my $key ( keys %$opt ) { if ( ! exists $valid->{$key} ) { croak "$sub '$key' is not a valid option name"; } next if ! defined $opt->{$key}; if ( $valid->{$key} eq 'Str' ) { croak "$sub $key => references are not valid values." if ref $opt->{$key} ne ''; } elsif ( $opt->{$key} !~ m/^$valid->{$key}\z/x ) { croak "$sub $key => '$opt->{$key}' is not a valid value."; } $self->{$key} = $opt->{$key}; } } 1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use strict; use warnings; use validate_options; # Factory Method sub new{ my $class = shift; my %opts = @_; my $self = bless{}, $class; $self->validate_options({name => 'foo'}, \%opts); } my $o = main->new( foo => 'bar' ); # new: 'foo' is not a valid option name at ... my $o = main->new( name => 'foo' ); # OK!