Folks,
With Perl6, we have singleton methods as
$me.meta.add_method(me => sub{ ... });
But is there a way to, say, add methods within lexical scope?
Take URI on Perl 5. URI behaves both as an object
my $uri = URI->new("http://dev.perl.org/perl6/");
print $uri->path; # "/perl6/"
But it also behaves as an ordinary string.
print $uri; # "http://dev.perl.org/perl6/"
In Perl5, this is done by overloading q(""). If you want anything
like this, you needed overloading. But in Perl6, I assume you'd go like
class URI is Str {
method path(){
# ....
}
}
So you don't have to resort to overloading. Now the questions are:
1. How are you going to initialize?
my URI $uri .= .new("http://dev.perl.org/perl6/");
or
my $uri = URI.new("http://dev.perl.org/perl6/");
or
my URI $uri = "http://dev.perl.org/perl6/";
?
2. How do the method access its internal string. Via $?SELF ?
Or should I use roles instead of classes in this kind of case? What
I want is make something like a "smart builtin classes" within Perl 6
semantics. You don't want to go like $uri.meta.add_method('path'
=> ...), right?
I know how to do that in Perl 5 (possible but difficult). I know how
to do that in Javascript (eazy but Str.prototype.yourmeth = function()
{...} makes ALL STRINGS smart). What's the recommended way in Perl 6?
Dan the Object Disoriented