환영합니다. 
플러그인의 작동원리는 생각보다 어렵지는 않습니다.
곧 나올 1.1도 크게 차이나지는 않지만 1.0.6.1 기준으로 설명드리겠습니다.
blog/index.php 파일을 열어보시면 1024 line ~ 1093 line이 플러그인과 관련된 부분입니다.
$activePlugins=array();
$eventMappings=array();
$tagMappings=array();
if(!empty($owner)){
$activePlugins=fetchQueryColumn("SELECT name FROM {$database['prefix']}Plugins WHERE owner = $owner");
$xmls=new XMLStruct();
foreach($activePlugins as $plugin){
$manifest=@file_get_contents("../plugins/$plugin/index.xml");
if($manifest&&$xmls->open($manifest)){
if($xmls->doesExist('/plugin/binding/listener')){
foreach($xmls->selectNodes('/plugin/binding/listener') as $listener){
if(!empty($listener['.attributes']['event'])&&!empty($listener['.value'])){
if(!isset($eventMappings[$listener['.attributes']['event']]))
$eventMappings[$listener['.attributes']['event']]=array();
array_push($eventMappings[$listener['.attributes']['event']],array('plugin'=>$plugin,'listener'=>$listener['.value']));
}
}
unset($listener);
}
if($xmls->doesExist('/plugin/binding/tag')){
foreach($xmls->selectNodes('/plugin/binding/tag') as $tag){
if(!empty($tag['.attributes']['name'])&&!empty($tag['.attributes']['handler'])){
if(!isset($tagMappings[$tag['.attributes']['name']]))
$tagMappings[$tag['.attributes']['name']]=array();
array_push($tagMappings[$tag['.attributes']['name']],array('plugin'=>$plugin,'handler'=>$tag['.attributes']['handler']));
}
}
unset($tag);
}
}else{
$plugin=mysql_escape_string($plugin);
mysql_query("DELETE FROM {$database['prefix']}Plugins WHERE owner = $owner AND name = '$plugin'");
}
}
unset($xmls);
unset($plugin);
}
function fireEvent($event,$target=null,$mother=null,$condition=true){
global $service,$eventMappings,$pluginURL;
if(!$condition)
return $target;
if(!isset($eventMappings[$event]))
return $target;
foreach($eventMappings[$event] as $mapping){
include_once ("../plugins/{$mapping['plugin']}/index.php");
if(function_exists($mapping['listener'])){
$pluginURL="{$service['path']}/plugins/{$mapping['plugin']}";
$target=call_user_func($mapping['listener'],$target,$mother);
}
}
return $target;
}
function handleTags(&$content){
global $service,$tagMappings,$pluginURL;
if(preg_match_all('/\[##_(\w+)_##\]/',$content,$matches)){
foreach($matches[1] as $tag){
if(!isset($tagMappings[$tag]))
continue;
$target='';
foreach($tagMappings[$tag] as $mapping){
include_once ("../plugins/{$mapping['plugin']}/index.php");
if(function_exists($mapping['handler'])){
$pluginURL="{$service['path']}/plugins/{$mapping['plugin']}";
$target=call_user_func($mapping['handler'],$target);
}
}
dress($tag,$target,$content);
}
}
}
위의 부분인데요. 보시면 아시겠지만 간단히 설명드리겠습니다. 
foreach($activePlugins as $plugin){
...
}
{$database['prefix']}Plugins 테이블에서 현재 사용중인 플러그인의 목록을 가져와서 루프를 돌게되죠.
설명을 위해 BlogIcon 플러그인과 TattertoolsBirthday 플러그인을 짬뽕시킨 예제;
...
<plugin version="1.0">
...
<binding>
<listener event="ViewCommenter">BlogIcon_main</listener>
<tag name="TattertoolsBirthday" handler="TattertoolsBirthday_TattertoolsBirthday" />
</binding>
...
</plugin>
$plugin에는 해당 플러그인의 디렉토리 이름이 있고 그 플러그인의 index.xml을 파싱을 하여 /plugin/binding/listener element와 /plugin/binding/tag element에 대하여 처리를 합니다.
listener쪽은 이벤트를 담당하는 부분으로 $eventMappings 배열에 이벤트명을 배열 index로 해서 플러그인 디렉토리명과 해당 이벤트를 처리해줄 함수명을 담습니다.
(위의 예제에서 ViewCommenter가 이벤트명이고 BlogIcon_main이 이벤트를 처리해줄 함수명입니다.)
tag쪽은 일반 치환자를 담당하는 부분으로 $tagMappings 배열에 tag element의 name attribute를 index로 해서 플러그인 디렉토리명과 해당 치환자를 처리해줄 함수명을 담습니다.
(위의 예제에서 TattertoolsBirthday가 배열 index가 되고 TattertoolsBirthday_TattertoolsBirthday가 치환자를 처리해줄 함수명입니다.)
이렇게 $eventMappings과 $tagMappings을 만들어두고 이벤트와 치환자를 각각 처리합니다.
fireEvent(($isComment?'ViewCommenter':'ViewGuestCommenter'),htmlspecialchars($commentSubItem['name']),$commentSubItem)
이벤트의 경우는 위의 예처럼 각 이벤트가 발생할 때마다 $eventMappings['ViewCommenter']에 있는 플러그인들을 include하여 call_user_func로 담아둔 함수를 호출하며 $target에 htmlspecialchars($commentSubItem['name']), $mother에 $commentSubItem를 넘겨줍니다.
따라서 이벤트로 발생하는 함수는 $target과 $mother를 둘다 받으셔야 합니다.
index.php
function BlogIcon_main($target, $mother) {
...
return $target;
}
치환자의 경우는 skin을 파싱하는 부분에서 처리를 하게되는데..
$sval=replaceSkinTag($sval,'html');
$sval=replaceSkinTag($sval,'head');
$sval=replaceSkinTag($sval,'body');
handleTags($sval);
이런 부분이 있는데 위의 세줄은 [##_SKIN_html_start_##], [##_SKIN_html_end_##], [##_SKIN_head_start_##], [##_SKIN_head_end_##], [##_SKIN_body_start_##], [##_SKIN_body_end_##]의 총 6개의 자동 생성 치환자를 만드는 부분이고..
handleTags에서 위와 같은 치환자들을 처리해주는데 방식은 이벤트와 큰 차이가 없지만 $mother가 없다는 것이 다릅니다.
index.php
function TattertoolsBirthday_TattertoolsBirthday($target) {
...
return $target;
}
또, 두가지의 경우 모두 $target을 받아서 반드시 return을 해주셔야 합니다.
이 것은 같은 이벤트나 치환자를 사용하는 다른 플러그인들에서도 충돌이 없이 작동을 하기 위해서인데 위의 코드를 보시면 이해가 가실겁니다. 
ps. 힘들다;;; 근데 이해를 하실려나 OTL