in reply to I need help calling can()

Your problem is nothing to do with can.

Ack, updated: chromatic has told me correctly that you can call code refs just like princepawn is doing. Which invalidates my first point, leaving me only with...

Your problem is how you're setting your variables in make_grid. You have:

my ($border,$width,$height) = $self->{border}, $self->$w(), $self->$b();
You need parens around the right side. So it should look like this:
my($border,$width,$height) = ($self->{border}, $w->($self), $b->($self));
And that fixes the problem, or so it would seem, since when running the code my terminal cursor gets repositioned (very annoyingly, I might add :).