\documentclass{article} \usepackage[a3paper]{geometry} \usepackage[cm]{fullpage} \usepackage[utf8]{inputenc} \usepackage{listings} \usepackage{verbatim} \usepackage[english]{babel} \usepackage{tikz} \usetikzlibrary{shapes,arrows,backgrounds,calc} \begin{document} \begin{tikzpicture} %{{{ tikz styles \tikzset{ header/.style={ellipse, draw=black, top color=white, bottom color=yellow!50,thick, inner sep=3mm, minimum size=3em, text centered, double, anchor=west}, pointer/.style = {signal, signal to=east, anchor=west}, mnemonic-block/.style={rectangle, anchor=west, inner sep=3mm}, line/.style = {draw}, comment/.style = {rectangle, rounded corners, draw, inner sep=3mm, anchor=west, text width = 8cm, node distance=1.5cm}, } %}}} \matrix[nodes={draw}, row sep=5mm, column sep=2mm,minimum width=.875cm, minimum height=1cm] { \node [header] (1_1) {Moose Attributes};\\\node [pointer] (2_1) {read-write / read only}; & \node [mnemonic-block] (2_2) {\begin{lstlisting}[language=Perl] has 'attr' => {is => 'rw'} has 'attr' => {is => 'ro'} \end{lstlisting}};\\\node [pointer] (3_1) {Accessor methods}; & \node [mnemonic-block] (3_2) {\begin{lstlisting}[language=Perl] has 'attr' => {reader => 'get_attr',} has 'attr' => {writer => 'set_attr',} \end{lstlisting}};\\\node [pointer] (4_1) {Predicate method}; & \node [mnemonic-block] (4_2) {\begin{lstlisting}[language=Perl] has 'attr' => {predicate => 'has_attr'} \end{lstlisting} }; & \node [comment] (4_3) {Tells you whether or not a given attribute is currently set};\\\node [pointer] (5_1) {Cleaner method}; & \node [mnemonic-block] (5_2) {\begin{lstlisting}[language=Perl] has 'attr' => {cleaner => 'clean_attr'} \end{lstlisting}}; & \node [comment] (5_3) {Unsets the attribute};\\\node [pointer] (6_1) {Required}; & \node [mnemonic-block] (6_2) {\begin{lstlisting}[language=Perl] has 'attr' => {required => 1} \end{lstlisting}};\\\node [pointer] (7_1) {Lazy}; & \node [mnemonic-block] (7_2) {\begin{lstlisting}[language=Perl] has 'attr' => {lazy => 1} \end{lstlisting} }; & \node [comment] (7_3) {When lazy is true, the default is not generated until the reader method is called};\\\node [pointer] (8_1) {Constructor parameters}; & \node [mnemonic-block] (8_2) {\begin{lstlisting}[language=Perl] has 'attr' => {init_arg => 'new_name'} \end{lstlisting} }; & \node [comment] (8_3) { Use a different name for the constructor parameter for this attribute. };\\\node [pointer] (9_1) {Weak references}; & \node [mnemonic-block] (9_2) {\begin{lstlisting}[language=Perl] has 'attr' => {weak_ref => 1} \end{lstlisting} }; & \node [comment] (9_3) { If you set the weak\_ref option to a true value, then it will call Scalar::Util::weaken whenever the attribute is set };\\\node [pointer] (10_1) {Trigger}; & \node [mnemonic-block] (10_2) {\begin{lstlisting}[language=Perl] has 'attr' => {trigger => \&attr_set} \end{lstlisting} }; & \node [comment] (10_3) {subroutine that is called whenever the attribute is set};\\\node [pointer] (11_1) {Attribute type}; & \node [mnemonic-block] (11_2) {\begin{lstlisting}[language=Perl] has 'attr' => {isa => 'Str',} has 'attr' => {isa => 'MyApp::Weapon',} \end{lstlisting} };\\\node [pointer] (12_1) {Documentation}; & \node [mnemonic-block] (12_2) {\begin{lstlisting}[language=Perl] has 'attr' => {documentation => q{Some text}} \end{lstlisting} };\\ }; \draw[line] (1_1.west) --++ (-5mm, 0) |- (2_1.west) --++ (-5mm, 0) |- (3_1.west) --++ (-5mm, 0) |- (4_1.west) --++ (-5mm, 0) |- (5_1.west) --++ (-5mm, 0) |- (6_1.west) --++ (-5mm, 0) |- (7_1.west) --++ (-5mm, 0) |- (8_1.west) --++ (-5mm, 0) |- (9_1.west) --++ (-5mm, 0) |- (10_1.west) --++ (-5mm, 0) |- (11_1.west) --++ (-5mm, 0) |- (12_1.west);\draw[line] (2_1.east) -- (2_2.west);\draw[line] (3_1.east) -- (3_2.west);\draw[line] (4_1.east) -- (4_2.west);\draw[line] (4_2.east) -- (4_3.west);\draw[line] (5_1.east) -- (5_2.west);\draw[line] (5_2.east) -- (5_3.west);\draw[line] (6_1.east) -- (6_2.west);\draw[line] (7_1.east) -- (7_2.west);\draw[line] (7_2.east) -- (7_3.west);\draw[line] (8_1.east) -- (8_2.west);\draw[line] (8_2.east) -- (8_3.west);\draw[line] (9_1.east) -- (9_2.west);\draw[line] (9_2.east) -- (9_3.west);\draw[line] (10_1.east) -- (10_2.west);\draw[line] (10_2.east) -- (10_3.west);\draw[line] (11_1.east) -- (11_2.west);\draw[line] (12_1.east) -- (12_2.west); \end{tikzpicture} \end{document}