package MyProject::OSSpecific::base;
use strict;
use warnings;
sub niceOSName
{
my $class=shift;
die "$class does not implement an OS specific niceOSName() method"
+;
}
sub tempDir
{
die "I don't know how to find a temp directory";
}
sub pathSep
{
return '/';
}
sub installTo
{
die "Should not happen";
}
# much more methods
1;
package MyProject::OSSpecific::doslike;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::base';
sub tempDir
{
return 'c:\\temp';
}
sub pathSep
{
return '\\';
}
# much more methods
1;
package MyProject::OSSpecific::dos;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::doslike';
use Some::DOS::Specific::Module;
sub niceOSName
{
my $x=`command /c ver`;
chomp $x;
return $x;
}
sub installTo
{
return 'C:\myproject';
}
1;
package MyProject::OSSpecific::MSWin32;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::doslike';
use Win32;
sub niceOSName
{
return Win32::GetOSName();
}
sub installTo
{
return 'C:\\Program Files\\MyProject';
}
1;
package MyProject::OSSpecific::unixlike;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::base';
sub niceOSName
{
my $x=`uname -a`;
chomp $x;
return $x;
}
sub tempDir
{
return '/tmp';
}
sub pathSep
{
return '/';
}
# much more methods
1;
package MyProject::OSSpecific::freebsd;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::unixlike';
use Something::Created::Only::For::FreeBSD;
sub installTo
{
return '/usr/local/myproject';
}
1;
package MyProject::OSSpecific::linux;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::unixlike';
use Something::Very::Linux::Specific;
sub installTo
{
return '/opt/myproject';
}
1;
And finally:
packame MyProject::OSSpecific;
use strict;
use warnings;
use parent 'MyProject::OSSpecific::'.$^O; # <-- this is the most impor
+tant trick here.
1;
In your code:
use strict;
use warnings;
use MyProject::OSSpecific;
print "This program should be installed to ",MyProject::OSSpecific->in
+stallTo(),"\n";
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
|