On Thu, Sep 08, 2005 at 07:41:52PM -0400, Stevan Little wrote:
: So it would be Foo::.keys() then?
: 
: Would this be possible?

The more I think about it, the more I'm leaning toword postfix
operators ::{} and ::<>, essentially in same syntactic niche as ::().
Which means you'd have to write that as

    Foo::{}.keys()

If these are really postfix operators, then we can also write

    Foo .::{}
    Foo .::<>
    Foo .::()

Postfix operators are expected in operator position.  Note that
::{$ref} in term position actually requires a hard $ref inside instead
of a key, so that's a slight inconsistency.  But probably one we can
live with.

: my $pkg = Foo::;
: # or maybe this ...
: my $pkg = Foo<::>;

If we went this way, that'd be:

    my $stash = Foo::{};

: Would $pkg be an instance of the Package class?

I don't think so.  I think that ::{} and ::<> would basically return
the hash attribute in the Package object.  So it's probably just Hash,
or maybe Stash.

: I would assume given 
: this code:
: 
: package Foo {
:       ...
:       package Foo::Bar {
:       ...
:       }
: }
: 
: I can do this:
: 
: my $pkg = Foo::{'::Bar'}
: 
: And get back some kind of Package reference of some kind.

Yes, that gives you the package.  But

    my $stash = Foo::{'::Bar'}::{}

would just give you the stash of the package.

By the way, you don't have to write your inner package as Foo::Bar, since
package/module/class declarations now assume "our".  (File-scoped classes
defaulting to * because that's the current package down to the first
declaration in the file.  Then the first declaration either switches
explicitly to some package/module/class, or a "use v6" thingie implicitly
switches to Main, or we're still in Perl 5's main.)

: Do we even have first class packages?

Sure.  They should be as first class as modules or classes.  But let
us now say that a package ISn't Hash and DOESn't Hash.  It merely HAS
a private stash attribute that does Hash, which is made accessible
(at least the public bits) via ::{}, ::<>, and ::().  Those operators
can by default hide access to private ._fnord methods, for instance.
And ::{}.keys would not tell you about private methods.

Hmm, that seems a little difficult to implement.  But hey, now that
we've decoupled the stash from *being* the package object by making
it an attribute, why don't we say that any ._fnordish things just
get stuffed into a *different* stash attribute, and the ::{} can
simply return the public stash without having to do any filtering.
I think that's a lot cleaner.

Larry

Reply via email to