Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^7: dynamic loading modules

by afoken (Prior)
on Sep 03, 2012 at 20:10 UTC ( #991511=note: print w/ replies, xml ) Need Help??


in reply to Re^6: dynamic loading modules
in thread dynamic loading modules

Perhaps you should have a look at the source of File::Spec. Or perhaps not. Think about the following construct first:

(Each code block represents a properly named file)

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". ;-)


Comment on Re^7: dynamic loading modules
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://991511]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (13)
As of 2015-07-07 14:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (89 votes), past polls