Tag: api-change
also in perl gibt es packages:
package MyApp::Model::X;
...
sub x { ... }
soweit so gut. aber in einem modularen Framework kommt man oft mit packagenamen nicht weit, denn diese sind normalerweise in irgendeinem namespace. z.b. gib es in der MyApp application u.a. folgende Packages.
package MyApp::Model::Comment;
...
package MyApp::Model::Text;
use MyApp::Model::Comment;
...
wenn man jetzt aber modular programmiert, hat man optimalerweise die comment-funktionalitaet in einem modul gekapselt, damit man das bei einer anderen applikation auch gleich verwenden kann. nur heisst die andere applikation dann z.b. MyApp2 und somit wird auch das Comment package in dem MyApp2 namespace geladen. d.h. das Text package muesste so definiert sein.
package MyApp2::Model::Text;
use MyApp2::Model::Comment;
damit man jetzt ein modul in mehreren namespaces verwenden kann, gab es in webtek den trick mit folgender definition:
package MyApp2::Model::Text;
use app->Modul->Comment;
das app->Modul->Comment wurde dann fuer die jeweilige applikation in z.b. MyApp2::Module::Comment uebersetzt. diese logik ist aber alles andere als gut, da es dann bei folgendem aufruf:
app->Model->Comment->find_one(id=>123)
keine unterscheidung mehr zwischen dem packetnamen, und der methode die aufgerufen wird, gibt. darum heisst die neue syntax jetzt wie folgt:
package MyApp2::Model::Text;
use app::Model::Comment;
my $comment = app::Model::Comment->find_one(id=>123);
intern wird das app::Model::Comment allerdings weiter in MyApp2::Model::Comment uebersetzt (mittels einem source-filter). d.h. weiters, dass man die module zusatztlich noch in jeder applikation in einem eigenen namespace liegen (= geladen) hat.
ich hoffe es hat jetzt irgendwer verstanden, was ich gemeint hab. wenn nicht, dann bitte nachfragen.