PHP hook, building hooks in your application
Introduction
One of the real challenges in building any type of framework, core or application is making it possible for the developers to hook into the business logic at specific points. Since PHP is not event based, nor it works with interrupts you have to come up an alternative.
The test case
Lets assume we are the main developers of a webshop framework. Programmers can use our framework to build complete webshops. Programmers can manage the orders that are placed on the webshop with the order class. The order class is part of our framework and we don’t want it to be extended by any programmer. However we don’t want to limit to programmers in their possibilities to hook into the orders process.
For example programmers should be able to send an email to the webshopowner if an order changes from one specific delivery status to another. This functionality is not part of the default behavior in our framework and is custom for the progammers webshop implementation.
Like said before, PHP doesn’t provide interrupts or real events so we need to come up with another way to implement hooks into our application. Lets take a look at the observer pattern.
Implementing the Observer pattern
The observer pattern is a design-pattern that describes a way for objects to be notified to specific state-changes in objects of the application.
For the first implementation we can use SPL. The SPL provides in two simple objects:
SPLSubject
- attach (new observer to attach)
- detach (existing observer to detach)
- notify (notify all observers)
SPLObserver
- update (Called from the subject (i.e. when it’s value has changed).
iOrderRef = $iOrderRef;
// Get order information from the database or an other resources
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param SplObserver $oObserver
* @return void
*/
public function attach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param SplObserver $oObserver
* @return void
*/
public function detach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notify()
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function delete()
{
$this->notify();
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notify();
// ...
$this->iStatus = $iStatus;
// ...
$this->notify();
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements SplObserver
{
/**
* Previous orderstatus
* @var int
*/
protected $iPreviousOrderStatus;
/**
* Current orderstatus
* @var int
*/
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oSubject
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(SplSubject $oSubject)
{
if(!$oSubject instanceof Order) {
return;
}
if(is_null($this->iPreviousOrderStatus)) {
$this->iPreviousOrderStatus = $oSubject->getStatus();
} else {
$this->iCurrentOrderStatus = $oSubject->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oSubject->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attach(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->delete();
?>
There are several problems with the implementation above. To most important disadvantage is that we have only one update method in our observer. In this update method we don’t know when and why we are getting notified, just that something happened. We should keep track of everything that happens in the subject. (Or use debug_backtrace… just joking, don’t even think about using it that way ever!).
Taking it a step further, events
Lets take a look at the next example, we will extend the Observer implementation with some an additional parameter for the eventname that occured.
Finishing up, optional data
iOrderRef = $iOrderRef;
// Get order information from the database or something else...
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function attachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function detachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notifyObserver($sEvent, $mData=null)
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this, $sEvent, $mData);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function add($aOrder = array())
{
$this->notifyObserver('onAdd');
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notifyObserver('onBeforeUpdateStatus');
// ...
$this->iStatus = $iStatus;
// ...
$this->notifyObserver('onAfterUpdateStatus');
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements Observer_Interface
{
protected $iPreviousOrderStatus;
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oObservable
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(Observable_Interface $oObservable, $sEvent, $mData=null)
{
if(!$oObservable instanceof Order) {
return;
}
switch($sEvent) {
case 'onBeforeUpdateStatus':
$this->iPreviousOrderStatus = $oObservable->getStatus();
return;
case 'onAfterUpdateStatus':
$this->iCurrentOrderStatus = $oObservable->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oObservable->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attachObserver(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->add();
?>
Now we are able to take action on different events that occur.
Disadvantages
Although this implementation works quite well there are some drawbacks. One of those drawbacks is that we need to dispatch an event in our framework, if we don’t programmers can’t hook into our application. Triggering events everywhere give us a small performance penalty however I do think this way of working gives the programmers a nice way to hook into your application on those spots that you want them to hook in.
Just for the record
Notice that this code is just an example and can still use some improvements, for example: each observer is initialized even it will maybe never be notified, therefore I suggest to make use of lazy in some cases for loading the objects. There are other systems to hook into an application, more to follow!
Ꮤith unlimited access tо practice worksheets, OMT empowers trainees tⲟ master math throuɡh repetition, developing affection fοr the subject and
examination self-confidence.
Discover tһe benefit ᧐f 24/7 online math tuition at OMT, wһere appealing resources mɑke learning
enjoyable and reliable fⲟr aⅼl levels.
Singapore’s world-renowned mathematics curriculum emphasizes conceptual
understanding οver mere calculation, making math
tuition vital fоr trainees to comprehend deep concepts аnd master national
examinations lіke PSLE and О-Levels.
Math tuition addresses specific finding оut paces,
allowing primary trainees tо deepen understanding ⲟf PSLE topics ⅼike areɑ,
border, and volume.
Ꮐiven the high stakes of O Levels for secondary school
progression іn Singapore, math tuition maximizes chances fοr leading grades ɑnd
desired positionings.
Іn an affordable Singaporean education ѕystem,
junior college math tuition ⲟffers trainees tһe edge tо attain high grades necеssary for
university admissions.
Βy integrating exclusive ɑpproaches with tһe MOE syllabus, OMT usеs a distinct technique tһat highlights quality аnd
deepness in mathematical thinking.
OMT’s affordable online alternative lah, ɡiving һigh quality tuition ԝithout damaging tһe bank fօr faг bettеr mathematics end results.
Individualized math tuition addresses specific weak ⲣoints, turning average entertainers іnto
exam mattress toppers іn Singapore’s merit-based system.
Feel free tⲟ surf tⲟ my web-site :: math tuition singapore
math tuition singapore
6 Oct 25 at 2:59 pm
Hi there! This post couldn’t be written any better!
Reading this post reminds me of my old room mate! He always kept chatting about this.
I will forward this write-up to him. Pretty sure he will have a good read.
Thanks for sharing!
Finxor GPT
6 Oct 25 at 3:00 pm
купить готовый диплом техникума [url=http://frei-diplom11.ru]купить готовый диплом техникума[/url] .
Diplomi_wtsa
6 Oct 25 at 3:01 pm
купить диплом в омске [url=rudik-diplom9.ru]купить диплом в омске[/url] .
Diplomi_fiei
6 Oct 25 at 3:01 pm
Dragon Money – казино с уникальным дизайном и множеством игр. Генерозные бонусы, оперативные выплаты и интуитивно понятный интерфейс создают идеальные условия для игры.
драгон мани рабочее зеркало
Donaldsledy
6 Oct 25 at 3:01 pm
купить диплом в балаково [url=www.rudik-diplom6.ru/]купить диплом в балаково[/url] .
Diplomi_hzKr
6 Oct 25 at 3:01 pm
The Minotaurus ICO referral system is paying off big; got extra tokens from invites. $MTAUR’s utility in power-ups makes it more than hype. This project’s got legs.
mtaur coin
WilliamPargy
6 Oct 25 at 3:03 pm
https://dr-md.ru/llms.txt
https://dr-md.ru/llms.txt
6 Oct 25 at 3:05 pm
Лучшие модели велосипедов 2025 года кракен даркнет кракен онион тор кракен онион зеркало кракен даркнет маркет
RichardPep
6 Oct 25 at 3:05 pm
My family members every time say that I am wasting my time here at web, however
I know I am getting knowledge all the time by reading such nice posts.
Zevrio Capiture のレビュー
6 Oct 25 at 3:06 pm
https://ds35zvezdochka.ru
HowardGoony
6 Oct 25 at 3:06 pm
Hi excellent blog! Does running a blog such as this require a large amount of work?
I have absolutely no understanding of programming however I had been hoping
to start my own blog soon. Anyhow, should you have any suggestions or tips for
new blog owners please share. I know this is off subject but I
simply needed to ask. Thanks a lot!
jackpot casino suisse
6 Oct 25 at 3:07 pm
купить диплом в гуково [url=http://www.rudik-diplom5.ru]купить диплом в гуково[/url] .
Diplomi_zama
6 Oct 25 at 3:08 pm
купить диплом с занесением в реестр [url=https://rudik-diplom12.ru/]купить диплом с занесением в реестр[/url] .
Diplomi_qoPi
6 Oct 25 at 3:10 pm
Если нужен профессиональный вывод из запоя, обращайтесь в стационар клиники «Детокс» в Сочи. Все процедуры проводятся анонимно и под наблюдением специалистов.
Изучить вопрос глубже – [url=https://vyvod-iz-zapoya-sochi24.ru/]нарколог на дом вывод из запоя в сочи[/url]
DavidAttag
6 Oct 25 at 3:10 pm
купить диплом автомеханика [url=https://rudik-diplom9.ru]купить диплом автомеханика[/url] .
Diplomi_iyei
6 Oct 25 at 3:11 pm
пин ап приложение авиатор [url=www.pinup5006.ru]www.pinup5006.ru[/url]
pin_up_qnKt
6 Oct 25 at 3:14 pm
Minotaurus coin’s audits by top firms reassure. Presale stage savings massive. Customizations await.
mtaur token
WilliamPargy
6 Oct 25 at 3:14 pm
Kaizenaire.com stands ɑpart as Singapore’sbest source fоr the
most popular promotions and deals frоm beloved brands and organizations.
In the heart of Asia, Singapore stands аs ɑn utmost shopping sanctuary
ԝһere Singaporeans prosper οn getting the ideal promotions ɑnd alluring deals.
Singaporeans love bubble tea runs ᴡith buddies ɑfter woгk, and keеp in mind to stay updated ⲟn Singapore’s most current promotions аnd shopping deals.
OCBC Bank delivers tһorough economic solutions including іnterest-bearing accounts аnd financial investment alternatives, valued Ƅy Singaporeans fоr theiг durable digital
systems ɑnd personalized services.
Samsung supplies electronics ⅼike smartphones and TVs lah, enjoyed Ьү technology lovers in Singapore fоr tһeir advanced attributes аnd resilience lor.
Putien brings Fujian food ⅼike fried Heng Hwa hoon, favored fⲟr
light, seafood-focused meals ѡith hometown beauty.
Eh, clever Singaporeans examine Kaizenaire.сom everyday mah, fоr
alⅼ the shiok shopping deals and discount rates lah.
Feel free tto visit mу web site: singapore coupons
singapore coupons
6 Oct 25 at 3:15 pm
купить диплом в белгороде [url=https://rudik-diplom13.ru/]купить диплом в белгороде[/url] .
Diplomi_wjon
6 Oct 25 at 3:16 pm
купить кухню в спб от производителя [url=https://kuhni-spb-1.ru/]kuhni-spb-1.ru[/url] .
kyhni spb_sdmi
6 Oct 25 at 3:16 pm
Saved as a favorite, I love your site!
welcome bonus casino
6 Oct 25 at 3:17 pm
I’m amazed, I have to admit. Seldom do I come across a blog that’s both educative
and amusing, and let me tell you, you have hit the nail on the head.
The problem is something that too few folks are speaking intelligently about.
I am very happy I found this during my search for something
relating to this.
Net Rowdex Avis
6 Oct 25 at 3:20 pm
Buy Amoxicillin for tooth infection: buy amoxicillin – Purchase amoxicillin online
Charleshaw
6 Oct 25 at 3:21 pm
купить диплом в георгиевске [url=https://www.rudik-diplom12.ru]купить диплом в георгиевске[/url] .
Diplomi_gmPi
6 Oct 25 at 3:22 pm
OMT’s suppoprtive responses loopholes motivate growth fгame ᧐f mind, aiding pupils love
mathematics ɑnd really feel inspired for examinations.
Dive іnto self-paced mathematics proficiency witһ OMT’ѕ 12-month
e-learning courses,tοtal witһ practice worksheets
ɑnd taped sessions for extensive revision.
Ιn Singapore’s strenuous education ѕystem, where mathematics іs obligatory аnd taқes
in around 1600 hоurs of curriculum time in primary school аnd secondary schools, math tuition endѕ
up being necessɑry to assist trainees construct а strong fouundation fߋr lօng-lasting success.
primary tuition іs necessaгү for PSLE as it ρrovides restorative assistance
fߋr topics lіke whole numbеrs and measurements, ensuring no
foundational weaknesses continue.
Identifying аnd fixing сertain weaknesses, likе in possibility ߋr
coordinate geometry, mɑkes secondary tuition crucial fоr
O Level quality.
Junior college math tuition cultivates іmportant believing abilities required t᧐ fix non-routine issues tһat typically ѕһow up in A Level mathematics evaluations.
OMT sets іtself аpart witһ an exclusive educational program that expands MOE
web сontent by consisting օf enrichment activities focused
օn creating mathematical instinct.
Νo requirement t᧐ take a trip, jᥙѕt log іn fгom hߋmе leh, saving time to research mⲟre and push your math grades һigher.
Ultimately, math tuition іn Singapore transforms potential гight intо
success, makung ⅽertain trainees not just pass уet
stand ᧐ut in thеiг mathematics examinations.
Αlso visit my web-site: primary school math tuition
primary school math tuition
6 Oct 25 at 3:24 pm
pin up uz ro‘yxatdan o‘tish [url=pinup5006.ru]pinup5006.ru[/url]
pin_up_ykKt
6 Oct 25 at 3:24 pm
LGBTQ escort Dubai betify.so
Jamesedife
6 Oct 25 at 3:27 pm
Драгон Мани – казино с ярким оформлением и богатым выбором игр. Щедрые бонусы, быстрые выплаты и удобный интерфейс делают игру комфортной и выгодной
драгон мани рабочее зеркало
Williamapoxy
6 Oct 25 at 3:28 pm
Don Mueang International Airport, Thailand (DMK)
[url=http://trips45.cc]трип скан[/url]
Are you an avgeek with a mean handicap? Then it’s time to tee off in Bangkok, where Don Mueang International Airport has an 18-hole golf course between its two runways. If you’re nervous from a safety point of view, don’t be — players at the Kantarat course must go through airport-style security before they hit the grass. Oh, you meant safety on the course? Just beware of those flying balls, because there are no barriers between the course and the runways. Players are, at least, shown a red light when a plane is coming in to land so don’t get too distracted by the game.
http://trips45.cc
трипскан вход
Although Suvarnabhumi (BKK) is Bangkok’s main airport these days — it opened in 2006 —Don Mueang, which started out as a Royal Thai Air Force base in 1914, remains Bangkok’s budget airline hub, with brands including Thai Air Asia and Thai Lion Air using it as their base. Although you’re more likely to see narrowbodies these days, you may just get lucky — in 2022, an Emirates A380 made an emergency landing here. Imagine the views from the course that day.
Related article
Sporty airport outfit being worn by writer
CNN Underscored: Flying sucks. Make it better with these comfy airport outfits for women
Sumburgh Airport, Scotland (LSI)
The road south from Lerwick cuts across the runway of Sumburgh Airport on Shetland.
The road south from Lerwick cuts across the runway of Sumburgh Airport on Shetland. Alan Morris/iStock Editorial/Getty Images
Planning a trip to Jarlshof, the extraordinarily well-preserved Bronze Age settlement towards the southern tip of Shetland? You may need to build in some extra time. The ancient and Viking-era ruins, called one of the UK’s greatest archaeological sites, sit just beyond one of the runways of Sumburgh, Shetland’s main airport — and reaching them means driving, cycling or walking across the runway itself.
There’s only one road heading due south from the capital, Lerwick; and while it ducks around most of the airport’s perimeter, skirting the two runways, the road cuts directly across the western end of one of them. A staff member occupies a roadside hut, and before take-offs and landings, comes out to lower a barrier across the road. Once the plane is where it needs to be, up come the barriers and waiting drivers get a friendly thumbs up.
Amata Kabua International Airport, Marshall Islands (MAJ)
Fly into Majuro and you’ll skim across the Pacific and land on the runway that’s just about as wide as the sandbar-like island itself.
Fly into Majuro and you’ll skim across the Pacific and land on the runway that’s just about as wide as the sandbar-like island itself. mtcurado/iStockphoto/Getty Images
Imagine flying into Majuro, the capital of the Marshall Islands in Micronesia. You’re descending down, down, and further down towards the Pacific, no land in sight. Then you’re suddenly above a pencil-thin atoll — can you really be about to land here? Yes you are, with cars racing past the runway no less, matching you for speed.
Majuro’s Amata Kabua International Airport gives a whole new meaning to the phrase “water landing”. Its single runway, just shy of 8,000ft, is a slim strip of asphalt over the sandbar that’s barely any wider than the atoll itself — and the island is so remote that when the runway was resurfaced, materials had to be transported from the Philippines, Hong Kong and Korea, according to the constructors. “Lagoon Road” — the 30-mile road that runs from top to toe on Majuro — skims alongside the runway.
Don’t think about pulling over, though — there’s only sand and sea on one side, and that runway the other.
Related article
Barra Airport, Scotland
At Scotland’s beach airport, the runway disappears at high tide
Willisgrard
6 Oct 25 at 3:30 pm
Выездная наркологическая помощь в Нижнем Новгороде — капельница от запоя с выездом на дом. Мы обеспечиваем быстрое и качественное лечение без необходимости посещения клиники.
Выяснить больше – [url=https://vyvod-iz-zapoya-nizhnij-novgorod11.ru/]наркология вывод из запоя нижний новгород[/url]
LarryZem
6 Oct 25 at 3:31 pm
кухни на заказ в спб цены [url=http://www.kuhni-spb-1.ru]http://www.kuhni-spb-1.ru[/url] .
kyhni spb_zlmi
6 Oct 25 at 3:31 pm
Its like you read my mind! You appear to know so much about this, like you wrote the book in it or something.
I think that you can do with a few pics to drive the message home a little bit, but other than that,
this is great blog. A great read. I will definitely be back.
Krentavest
6 Oct 25 at 3:31 pm
https://dr-md.ru/llms.txt
https://dr-md.ru/llms.txt
6 Oct 25 at 3:31 pm
купить диплом в ялте [url=rudik-diplom12.ru]купить диплом в ялте[/url] .
Diplomi_nyPi
6 Oct 25 at 3:32 pm
https://krasavchikbro.ru
HowardGoony
6 Oct 25 at 3:32 pm
OMT’s blend օf online and on-site options оffers versatility, mаking mathematics accessible ɑnd charming, ѡhile motivating Singapore trainees fоr exam
success.
Join օur smalⅼ-group on-site classes іn Singapore fοr tailored guidance in a nurturing
environmjent tһat constructs strong fundamental math skills.
Τhe holisticc Singapore Math technique, ԝhich constructs multilayered
рroblem-solving abilities, highlights ᴡhy math tuition іѕ indispensable for mastering the curriculum and getting ready for
future professions.
Ϝor PSLE achievers, tuition рrovides mock tests ɑnd feedback,
helping improve answers fߋr optimum marks in both multiple-choice аnd open-ended areas.
Personalized math tuition in high school addresses individual finding оut voids
in subjects ⅼike calculus and statistics, preventing them fгom impeding O Level
success.
Junior college math tuition cultivates vital believing abilities required tⲟ
solve non-routine issues tһat uѕually ɑppear іn A Level mathematics assessments.
Τhe distinctiveness оf OMT originates from its proprietary mathematics educational program tһat prolongs MOE material ᴡith project-based understanding fоr functional application.
OMT’ѕ οn tһe internet math tuition аllows you modify ɑt yoᥙr very own rate lah, sо say goоdbye to hurrying annd
yoᥙr math grades ᴡill certainly firе uр continuously.
Ᏼy focusing on mistake evaluation, math tuition prevents repeating
errors tһat coulԁ cost valuable marks іn Singapore tests.
my site: private tutor in maths subject how much
private tutor in maths subject how much
6 Oct 25 at 3:33 pm
Hello friends, pleasant article and pleasant urging commented
here, I am in fact enjoying by these.
Lampo Bitmark Recensione
6 Oct 25 at 3:34 pm
прямые кухни на заказ от производителя [url=http://www.kuhni-spb-1.ru]http://www.kuhni-spb-1.ru[/url] .
kyhni spb_iami
6 Oct 25 at 3:37 pm
You actually make it appear so easy along with your
presentation but I find this topic to be actually one thing that I
feel I might by no means understand. It seems too complicated
and very wide for me. I am taking a look forward for your next post, I will
attempt to get the grasp of it!
Finxor GPT
6 Oct 25 at 3:37 pm
I take pleasure in, cause I discovered just what I was
taking a look for. You’ve ended my four day lengthy hunt!
God Bless you man. Have a nice day. Bye
Fintruxel TEST
6 Oct 25 at 3:38 pm
https://dr-md.ru/llms.txt
https://dr-md.ru/llms.txt
6 Oct 25 at 3:38 pm
Gay call boy Dubai
Jamesedife
6 Oct 25 at 3:38 pm
купить сертификат специалиста [url=www.rudik-diplom9.ru/]купить сертификат специалиста[/url] .
Diplomi_aeei
6 Oct 25 at 3:40 pm
прямые кухни на заказ от производителя [url=https://kuhni-spb-1.ru/]https://kuhni-spb-1.ru/[/url] .
kyhni spb_pmmi
6 Oct 25 at 3:41 pm
Бесплатная консультация при покупке велосипеда сайт kraken darknet kraken маркетплейс зеркало кракен ссылка кракен даркнет
RichardPep
6 Oct 25 at 3:42 pm
Велосипеды для дачи и активного отдыха kraken onion кракен онион тор кракен онион зеркало кракен даркнет маркет
RichardPep
6 Oct 25 at 3:44 pm
где купить диплом о среднем образование [url=www.rudik-diplom13.ru/]где купить диплом о среднем образование[/url] .
Diplomi_slon
6 Oct 25 at 3:44 pm
Best place to buy propecia [url=https://regrowrxonline.com/#]Best place to buy propecia[/url] Propecia prescription
Davidbax
6 Oct 25 at 3:44 pm
Thanks to my father who shared with me on the topic of this webpage, this website is really remarkable.
Click Here
6 Oct 25 at 3:45 pm