public function getAttr($obj, $attr, $args = array())
{
if (is_array($obj)) {
if (isset($obj[$attr])) {
if ($obj[$attr] instanceof \Closure) {
if (is_array($args)) {
array_unshift($args, $obj);
} else {
$args = array($obj);
}
return call_user_func_array($obj[$attr], $args);
} else {
return $obj[$attr];
}
} else {
return null;
}
} elseif (is_object($obj)) {
if (is_array($args)) {
$callable = array($obj, $attr);
return is_callable($callable) ? call_user_func_array($callable, $args) : null;
} else {
$members = array_keys(get_object_vars($obj));
$methods = get_class_methods(get_class($obj));
if (in_array($attr, $members)) {
return @$obj->{$attr};
} elseif (in_array('__get', $methods)) {
return $obj->__get($attr);
} else {
$callable = array($obj, $attr);
return is_callable($callable) ? call_user_func($callable) : null;
}
}
} else {
return null;
}
}