.ooo
          'OOOo
      ~ p ooOOOo 2 ~
          .OOO
           oO      %% a fast perl5
             Oo
            'O
             `
            (o)
        ___/ /          
       /`    \ 
      /v^  `  ,
     (...v/v^/
      \../::/
       \/::/ 

See the pamphlet for an overview of the potion syntax and data structures.

tuple
an ordered list
table
a hash
but with list syntax
lick
a nested data structure, i.e. named hash. the keys are called path.

Every lick can have a name, a table of attributes, and a list of
children. The list of children can, instead, be a Potion data
type, such as a number or string or something.

path
key of a lick, an instance variable of an object.

Paths cannot be randomly added to the object after the object
is created. Each object has a strict set of paths. Every path
which is used in the constructor is added to the object upon
creation.

upvalue
A variable in an upper scope.

Since a closure doesn’t have access to the registers
of another function, these variables are passed
as pointers (the PNWeakRef struct.)

Lobby
potion named the main interp object Lobby, which holds the
methods about, here, exit, self, …
p2 renames it to "P2"
mop
potion/p2 uses the cola mop
with 5 core functions: addMethod, lookup, allocate, delegated and intern.
And 4 native (and jitted) VM ops: SELF, CLASS, BIND and MSG.
p2-mop
flex
the mixin type. A mixin is created with potion_type_new() referencing a parent type, and are handled with PN_FLEX macros.