getFields(); $parent = $struct->getParent(); if($parent) //NOTE: order is important, parent fields must come first $fields = array_merge(mtg_get_all_fields($parent), $fields); return $fields; } function mtg_find_field_owner(mtgMetaStruct $struct, $name) { $tmp = $struct; while($tmp) { $fields = $tmp->getFields(); if(isset($fields[$name])) return $tmp; $tmp = $tmp->getParent(); } return null; } function mtg_try_get_token_in_hierarchy(mtgMetaStruct $struct, $name, &$value) { $tmp = $struct; while($tmp) { if($tmp->hasToken($name)) { $value = $tmp->getToken($name); return true; } $tmp = $tmp->getParent(); } return false; }