this isn't completely possible.
no matter what you do with tie, bless, etc. the following lines won't work as you expect:
$d = "Nov 25, 1971";
print "\$d contains $d\n"; # "Nov 25, 1971"
print "\$d as unixtime:", $d->to_unixtime, "\n";
with a tie, you can't directly do $d->to_unixtime, it has to be tied($d)->to_unixtime.
otherwise you'll get the message:
Can't locate object method "to_unixtime" via package "Nov 25, 1971" (perhaps you forgot to load "Nov 25, 1971"?)
with a regular object, you can't of course do $d = "Nov 25, 1971" because this would destroy the object previously assigned to $d.
the most functional hack I could come up with is the use of tie AND overload AND tye's suggestion, as in:
Datum->tieVar( (my $d), -type=>'date' );
$d = "Nov 25, 1971";
print STDOUT "\$d contains $d\n"; # "Nov 25, 1971"
print STDOUT "\$d as unixtime:", $d->to_unixtime, "\n";
package Datum;
use overload '""' => \&to_string;
sub tieVar {
my $class= shift @_;
my $toTie= \$_[0]; shift @_;
tie $$toTie, $class, @_;
}
sub TIESCALAR {
my $class = shift;
my $instance = shift || undef;
return bless \$instance => $class;
}
sub STORE {
${$_[0]} = $_[1];
}
sub FETCH {
# this just returns "self"
# (won't be good in some cases)
return $_[0];
}
sub to_string {
# this is the "real" FETCH method
return ${$_[0]};
}
sub to_unixtime {
return "foobar";
}
this prints what you expect:
$d contains Nov 25, 1971
$d as unixtime:foobar
...but this is a hack, as it works correctly only when fetching $d in a string context. it has the implicit advantage, however, that $d could return something different (perhaps
$d->to_unixtime) in numeric context.
cheers,
Aldo
King of Laziness, Wizard of Impatience, Lord of Hubris
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.