[Melbourne-pm] overloading 'print'
mathew.robertson at netratings.com.au
Fri Mar 17 00:07:03 PST 2006
>> Does anone know how to overload 'print'?
> The short answer is that you can't. Print isn't one of Perl's overloadable
> functions. (The reason is that the syntax is special cased. You cannot make a
> user function with the same prototype.)
ok - I'm guessing this is because print can take a filehandle as the
first argument ?
> The longer answer is that you can... if you use IO::File and its print method.
> Then you can just subclass IO::File, and mask the print method to do what you need.
> The other non-overridable functions are listed in receipt 12.11 in the Perl
> Cookbook (1st Edition). Basically, if the keyword function in toke.c returns a
> negative number, then that function can't be overridden.
ok - thats a bit complicated. Any ideas on the implementation of the
sub-class of IO::File ?
ASIDE: The reason for wanting to override 'print' is... I have built a
language translation module (Locale::MakePhrase) which works quite well
- now I am working on simplifying its usage so that it can be used
within applications more easily. eg:
Currently if I want to print out a string translated (to say Chinese), I
would code something like:
my $mp = Locale::MakePhrase->new(language => 'zn_ch', ....);
print $mp->translate("Some text to translate");
thus to use the module within your application, would require the
application code to modified to support the L::M syntax. What I would
like to do is extend L::M to override 'print' so that the code becomes
use Locale::MakePhrase qw(print);
Locale::MakePhrase->new(language => 'zn_ch',...);
print "Some text to translate";
Thus with two simple lines at the top of the application, you
automagically get all of the translation facilities. If you choose to
use a different translation tool, you simply change those two lines -
thus saving you from having to re-code your app for the new API.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Melbourne-pm