In order to use a coderef as a method, you need to manually pass the object as the first arg.
Not necessarily.
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 2;
package Foo;
sub new { bless {}, $_[0] }
sub report { return [ @_ ] }
package main;
my $foo = Foo->new();
my $report = \&Foo::report;
my $moreport = $foo->can( 'report' );
is_deeply( $foo->$report( 'abc' ), [ $foo, 'abc' ],
'coderef should work as method on object' );
is_deeply( $foo->$moreport( 'def' ), [ $foo, 'def' ],
'... even if returned from can()' );