# New Ticket Created by  Lloyd Fournier 
# Please include the string:  [perl #127569]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=127569 >


When a package already exists in an outer scope, any package declared will
insert itself into it even if it's meant to be lexically scoped. This
includes the SETTING(s) (the most outer scopes). It is also problematic for
our scoped things which manage to transcend the compunit interface's
encapsulation of their globalish symbols.

This leads to a number of problems and inconsistencies. I believe it will
be even more relevant when we try and implement jnthn++'s versioning design:

https://6guts.wordpress.com/2016/02/09/a-few-words-on-perl-6-versioning-and-compatibility/

Some examples:

## 1 leak out of lexical scope
{
   my module Cool::Utils { }
}
say Cool::Utils;

## 2 runtime symbol refers to something different to compile time symbol
with same name
sub leaked-into {
      my class Cool::Utils { method doit { "one" } }
      say Cool::Utils.doit; #->one
      say ::("Cool::Utils").doit; #->two
}

{
      my class Cool::Utils { method doit { "two" } }
      leaked-into();
}

## 3 our scoped packages are not available for introspecting in
CompUnit::Handle.globalish-package;

# lib/Cool/Utils.pm
class Cool::Utils {}
class Foo { };

# main.pl
my $cu =
$*REPO.need(CompUnit::DependencySpecification.new(:short-name("Cool::Utils"));
say $cu.handle.globalish-package.WHO.keys; #-> (Foo)

# This was one of the things I didn't consider ( and isn't tested in
require.t -- will do now) which caused problems with my patch.
# see https://github.com/rakudo/rakudo/pull/714 ugexe's comment.

------------

Another problem with our scoped packages inserting themselves into the
setting is that when we have multiple settings which one of them does it
insert it into?

What if a module like IO::Socket::SSL has 'use v6.c', so it never sees the
6.d setting. Then someone does:

use v6.d;
use IO::Socket::SSL;

If the 6.c-IO::Socket.WHO === 6.d-IO::Socket.WHO everything will be fine,
but if not IO::Socket::SSL won't be visible to the 6.d code. It could copy
itself to all the settings but that seems ugly to me.

The solution could be to create a special type of package used for
declaring sub-packages of packages that already exist in an outer scope
which could search it's own .WHO for the symbol before delegating to the
outer scope package's WHO.

Reply via email to