\documentclass{article}

\usepackage[left=1cm, right=1cm]{geometry} % reduce page margins

\usepackage{amssymb}
\usepackage{booktabs}
\usepackage[normalem]{ulem}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{color,listings}
\usepackage{awesomebox}

\newcommand{\specialcell}[2][c]{%
  \begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}

\def\ck{\checkmark} 

\begin{document}

\centering
\begin{scriptsize}
\begin{tabular}{|l|c|c|c|c|c|l|}
  \hline
    &  \multicolumn{5}{c|}{Availability in Context} &  \\
  \hline
    &  \multicolumn{2}{c|}{ \specialcell{Meta-Model \\ Constraint}} & \multicolumn{2}{c|}{ \specialcell{Model Trans- \\ formation Rule} } & & \\

  \hline
     & \specialcell{ \textbf{Local} }
     & \specialcell{ \textbf{Global} }
     & \specialcell{ \textbf{NAC} \\ \textbf{LHS} }
     & \textbf{RHS}
     & \specialcell{ \textbf{OD-} \\ \textbf{API} }
     & \textbf{Meaning} \\
  \hline
  \hline
    \multicolumn{7}{|l|}{\textit{Querying}} \\
  \hline
  \texttt{this :obj} & \ck & & \ck & \ck & & Current object or link \\
  \hline
  \texttt{get\_name(:obj) :str} & \ck & \ck & \ck & \ck & \ck & Get name of object or link \\
  \hline
  \texttt{get(name:str) :obj} & \ck & \ck & \ck & \ck & \ck & Get object or link by name (inverse of \texttt{get\_name}) \\
  \hline
  \texttt{get\_type(:obj) :obj} & \ck & \ck & \ck & \ck & \ck & {Get type of object or link} \\
  \hline
  \texttt{get\_type\_name(:obj) :str} & \ck & \ck & \ck & \ck & \ck & {Same as \texttt{get\_name(get\_type(...))}} \\
  \hline
  \specialcell{
       \texttt{is\_instance(:obj, type\_name:str}
    \\ \texttt{    [,include\_subtypes:bool=True]) :bool}
  } & \ck & \ck & \ck & \ck & \ck & \specialcell{Is object instance of given type\\(or subtype thereof)?} \\
  \hline

  \texttt{get\_value(:obj) :int|str|bool} & \ck & \ck & \ck & \ck & \ck & \specialcell{Get value (only works on Integer,\\String, Boolean objects)} \\
  \hline
  \texttt{get\_target(:link) :obj} & \ck & \ck & \ck & \ck & \ck & {Get target of link} \\
  \hline
  \texttt{get\_source(:link) :obj} & \ck & \ck & \ck & \ck & \ck & {Get source of link} \\
  \hline
  \texttt{get\_slot(:obj, attr\_name:str) :link} & \ck & \ck & \ck & \ck & \ck & {Get slot-link (link connecting object to a value)} \\
  \hline
  \specialcell{
      \texttt{get\_slot\_value(:obj,}
      \\ \texttt{attr\_name:str) :int|str|bool}
   } & \ck & \ck & \ck & \ck & \ck & {Same as \texttt{get\_value(get\_slot(...))})} \\
  \hline

  \specialcell{
         \texttt{get\_all\_instances(type\_name:str}
      \\ \texttt{    [,include\_subtypes:bool=True]}
      \\ \texttt{) :list<(str, obj)>}
    } & \ck & \ck & \ck & \ck & \ck & \specialcell{Get list of tuples (name, object) \\ of given type (and its subtypes).} \\
  \hline
  \specialcell{
       \texttt{get\_outgoing(:obj,}
    \\ \texttt{ assoc\_name:str) :list<link>}
  } & \ck & \ck & \ck & \ck & \ck & {Get outgoing links of given type} \\
  \hline
    \specialcell{
       \texttt{get\_incoming(:obj,}
    \\ \texttt{ assoc\_name:str) :list<link>}
  } & \ck & \ck & \ck & \ck & \ck & {Get incoming links of given type} \\
  \hline
  \texttt{has\_slot(:obj, attr\_name:str) :bool} & \ck & \ck & \ck & \ck & \ck & {Does object have given slot?} \\
  \hline
  \texttt{matched(label:str) :obj} & & & \ck & \ck & & \specialcell{Get matched object by its label \\ (the name of the object in the pattern)} \\

  \hline
  \hline
    \multicolumn{7}{|l|}{\textit{Modifying}} \\
  \hline
  \texttt{delete(:obj)} & & & & \ck & \ck & {Delete object or link} \\
  \hline

  \specialcell{
       \texttt{set\_slot\_value(:obj, attr\_name:str,}
    \\ \texttt{    val:int|str|bool)}
  } & & & & \ck & \ck & \specialcell{Set value of slot.
                              \\ Creates slot if it doesn't exist yet.} \\
  \hline

  \specialcell{
    \texttt{create\_link(link\_name:str|None,} \\
    \texttt{  assoc\_name:str, src:obj, tgt:obj) :link}
  } & & & & \ck & \ck & \specialcell{Create link (typed by given association). \\
                                 If \texttt{link\_name} is None, name is auto-generated.} \\
  \hline
  \specialcell{
    \texttt{create\_object(object\_name:str|None,} \\
    \texttt{  class\_name:str) :obj}
  } & & & & \ck & \ck & \specialcell{Create object (typed by given class). \\
                                 If \texttt{object\_name} is None, name is auto-generated.} \\
  \hline
  % \texttt{print(*args)} & \multicolumn{2}{c|}{Python's print function (useful for debugging)} & no, use the real print() \\
\end{tabular}
\end{scriptsize}

\end{document}