def column(self, key, recurse=True, flags=<NUM_LIT:0>, raise_=True):
if isinstance(key, orb.Column):<EOL><INDENT>return key<EOL><DEDENT>else:<EOL><INDENT>cache_key = (key, recurse, flags)<EOL>try:<EOL><INDENT>last_column = self.__cache[cache_key]<EOL><DEDENT>except KeyError:<EOL><INDENT>parts = key.split('<STR_LIT:.>')<EOL>schema = self<EOL>last_column = None<EOL>for part in parts:<EOL><INDENT>cols = schema.columns(recurse=recurse, flags=flags)<EOL>found = None<EOL>for column in cols.values():<EOL><INDENT>if part in (column.name(), column.field()):<EOL><INDENT>found = column<EOL>break<EOL><DEDENT><DEDENT>if found is None:<EOL><INDENT>break<EOL><DEDENT>elif isinstance(found, orb.ReferenceColumn):<EOL><INDENT>schema = found.referenceModel().schema()<EOL><DEDENT>last_column = found<EOL><DEDENT>self.__cache[cache_key] = last_column<EOL><DEDENT>if last_column is not None:<EOL><INDENT>return last_column<EOL><DEDENT>elif raise_:<EOL><INDENT>raise orb.errors.ColumnNotFound(schema=self, column=key)<EOL><DEDENT>else:<EOL><INDENT>return None<EOL><DEDENT><DEDENT>
Returns the column instance based on its name.  
If error reporting is on, then the ColumnNotFound
error will be thrown the key inputted is not a valid
column name.

:param      key     | <str> || <orb.Column> || <list>
            recurse | <bool>
            flags   | <int>

:return     <orb.Column> || None