public static Member HasMembersPossiblyOnParent(IHavePossibleMembers parent, IKey key, Func <Member> member)
 {
     if (parent.PossibleMembers.TryGetValue(key, out var res))
     {
         return(res);
     }
     res = member();
     parent.PossibleMembers.Add(key, res);
     return(res);
 }
                public Member CreateMemberPossiblyOnParent(IStaticScope scope, IHavePossibleMembers havePossibleMembers, IKey key)
                {
                    // this is weird, but since C# does not have and types...
                    // scope and havePossibleMembers are expected to be the same object
                    if (!ReferenceEquals(scope, havePossibleMembers))
                    {
                        throw new Exception($"{scope} and {havePossibleMembers} should be the same object");
                    }

                    if (havePossibleMembers.PossibleMembers.TryGetValue(key, out var res1))
                    {
                        return(res1);
                    }

                    var res = HasMembersPossiblyOnParent(havePossibleMembers, key, () => new Member(this, "possibly on parent -" + key.ToString()));

                    res.Context = Possibly.Is(scope);
                    return(res);
                }