There is no problem with using a simple scalar variable when dynamically calling a method, as
Fletch illustrated. However if you're using an aggregate variable or an expression you can simply use the
can method e.g
print $rowobj->can( $cols{id} )->();
Or if you wish to call it directly you need to be a little indirect and take advantage of scalar dereferencing e.g
print $rowobj->${ \$cols{id} };
Addendum: On a more practical note you can always access the primary key by using the
id accessor method, regardless of what is the name of the actual row;
as documented.