Resolva dependências circulares com Carp :: Always

Dependências circulares acontecem quando sua biblioteca requer uma biblioteca que requer sua biblioteca. Aqui está um exemplo. Digamos que você tenha 2 pacotes:

AlienPlanet.pm

package AlienPlanet;
use Moose;
use Dinosaurs; # <--- Circular dependency
sub has_dinosaurs {1}
1;

Dinosaurs.pm

package Dinosaurs;
use Moose;
use AlienPlanet; # <--- Circular dependency
sub has_rabies {1}
1;

Se você tentar compilá-lo, receberá o seguinte aviso:

 perl -c AlienPlanet.pm 
Subroutine has_dinosaurs redefined at AlienPlanet.pm line 5.
AlienPlanet.pm syntax OK

Neste caso, é óbvio onde está o problema.

Mas se o pacote que você incluiu incluiu 25 outras bibliotecas, que incluiu outras bibliotecas, que incluiu sua biblioteca original – então será mais difícil descobrir onde está o círculo.

Felizmente descobri uma boa solução. Primeiro, modifique AlienPlanet.pm para ficar assim:

package AlienPlanet;
sub has_dinosaurs {1} <-- swap
use Dinosaurs; <-- swap
1;

Em seguida, tente compilar seu código novamente, mas desta vez com Carp :: Always :

 perl -MCarp::Always -c AlienPlanet.pm
Subroutine has_dinosaurs redefined at AlienPlanet.pm line 4.
require AlienPlanet.pm called at Dinosaurs.pm line 4
Dinosaurs::BEGIN() called at AlienPlanet.pm line 4
eval {...} called at AlienPlanet.pm line 4
require Dinosaurs.pm called at AlienPlanet.pm line 5
AlienPlanet::BEGIN() called at AlienPlanet.pm line 4
eval {...} called at AlienPlanet.pm line 4
AlienPlanet.pm syntax OK

Agora você tem um rastreamento de pilha e é fácil ver onde está o seu problema. Tudo o que resta é descobrir como resolvê-lo. (Solução rápida: use Class :: Load no pacote Dinosaurs.)

Cross postado em blog.kablamo.org