Jan Dubois wrote:
>> How about something more direct...
>>
>> $IsWin95 = defined &Win32::IsWin95 ? Win32::IsWin95() : !defined 
>> $ENV{SYSTEMROOT};
>>
>> The outwardly unrelated DynaLoader is completely removed from the equation, 
>> this better
>> future proofs uses of Win32::, and the purpose of using SYSTEMROOT as a 
>> fallback
>> is made plain.
> 
> Sure, the problem is that your code doesn't work.  The function is always 
> defined
> for backward compatibility reasons.  It just implemented something like this 
> (in XS):
> 
>   sub Win32::IsWin95 {
>       eval "use Win32 0.27";
>       die $@ if $@;
>       goto &Win32::IsWin95;
>   }

Perhaps instead use an AUTOLOAD?

  package Win32;
  sub AUTOLOAD {
        eval "use Win32 0.27";
        die $@ if $@;

        # Once we've loaded Win32.pm we no longer need the AUTOLOAD
        delete $Win32::{AUTOLOAD};

        no strict 'refs';
        goto &{$AUTOLOAD};
  }

It will be called once to automatically load Win32.pm and then never again so 
no run-time performance loss.  It also means defined &Win32::foo works as 
expected.  One less surprise for the user.

Reply via email to