I would have someting like this working
use strict;
use warnings;
use Devel::Cycle;
package A;
sub new {
my ( $class, $href ) = @_;
my $self = { dbi => $$href{dbi} };
$self->{helper} =
Helper->new( helper_function => sub {
my $dbi = $$href{dbi};
return $self->this_is_from_A(@_);
} );
bless $self, $class;
}
sub do_something {
my $self = shift;
$self->{helper}->called_from_helper();
}
sub this_is_from_A {
my ($self, $arg) = @_;
print "$arg\nthis_is_from_A using $dbi\n";
}
package Helper;
sub new {
my $class = shift;
my %def = ( a => "something");
my %arg = ( ref $_[0] eq "HASH" ? ( %def, %{ $_[0] } ) : ( %def,
+ @_ ) );
my $self = \%arg;
bless $self, $class;
}
sub called_from_helper {
my $self = shift;
print "called_from_helper\n";
my $coderef = $self->{helper_function}->();
$coderef->("param from Helper");
}
package main;
my $a = A->new( { dbi => "some dbi object" } );
$a->do_something();
$a->do_something();
find_cycle($a);
But this does not even compile since
$dbi in
this_is_from_A is not declared.