diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2015-08-26 14:27:43 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2015-08-26 23:06:46 +0900 |
commit | 5551f7360398e46525e9d54553e441a6a713fb6d (patch) | |
tree | f8f7a331e4ec648cdb39c7a61baf182878565031 /core/plugin.rb | |
parent | 9dcab42a88652c0969d4fcb8fb8c3f028a6683ea (diff) | |
download | mikutter-5551f7360398e46525e9d54553e441a6a713fb6d.tar.gz |
pluggaloidを使う
Diffstat (limited to 'core/plugin.rb')
-rw-r--r-- | core/plugin.rb | 189 |
1 files changed, 11 insertions, 178 deletions
diff --git a/core/plugin.rb b/core/plugin.rb index 10120d75..4d0196c7 100644 --- a/core/plugin.rb +++ b/core/plugin.rb @@ -1,67 +1,18 @@ # -*- coding: utf-8 -*- -miquire :core, 'configloader', 'environment', 'event', 'event_listener', 'event_filter' -miquire :lib, "instance_storage", 'delayer' +require 'pluggaloid' +miquire :core, 'configloader' -# プラグインの本体。 -# DSLを提供し、イベントやフィルタの管理をする -class Plugin - include ConfigLoader - include InstanceStorage - - class << self - # プラグインのインスタンスを返す。 - # ブロックが渡された場合、そのブロックをプラグインのインスタンスのスコープで実行する - # ==== Args - # [plugin_name] プラグイン名 - # ==== Return - # Plugin - def create(plugin_name, &body) - type_strict plugin_name => Symbol - Plugin[plugin_name].instance_eval(&body) if body - Plugin[plugin_name] end +Event = Pluggaloid::Event - # イベントを宣言する。 - # ==== Args - # [event_name] イベント名 - # [options] 以下のキーを持つHash - # :prototype :: 引数の数と型。Arrayで、type_strictが解釈できる条件を設定する - # :priority :: Delayerの優先順位 - def defevent(event_name, options = {}) - type_strict event_name => Symbol, options => Hash - Event[event_name].options = options end +EventListener = Pluggaloid::Listener - # イベント _event_name_ を発生させる - # ==== Args - # [event_name] イベント名 - # [*args] イベントの引数 - # ==== Return - # _event_name_ に対応する Event のインスタンス - def call(event_name, *args) - type_strict event_name => Symbol - Event[event_name].call(*args) end +EventFilter = Pluggaloid::Filter - # 引数 _args_ をフィルタリングした結果を返す - # ==== Args - # [*args] 引数 - # ==== Return - # フィルタされた引数の配列 - def filtering(event_name, *args) - type_strict event_name => Symbol - Event[event_name].filtering(*args) - end - - # 互換性のため - def uninstall(plugin_name) - self[plugin_name].uninstall - end - - # 互換性のため - def filter_cancel! - EventFilter.cancel! end - - alias plugin_list instances_name +class Plugin < Pluggaloid::Plugin + include ConfigLoader + class << self def activity(kind, title, args = {}) Plugin.call(:modify_activity, { plugin: nil, @@ -69,82 +20,8 @@ class Plugin title: title, date: Time.new, description: title }.merge(args)) end - - alias __clear_aF4e__ clear! - def clear! - Event.clear! - __clear_aF4e__() - end end - # プラグインの名前 - attr_reader :name - - # spec - attr_accessor :spec - - # 最初にプラグインがロードされた時刻(uninstallされるとリセットする) - attr_reader :defined_time - - # ==== Args - # [plugin_name] プラグイン名 - def initialize(*args) - super - @defined_time = Time.new.freeze - @events = Set.new - @filters = Set.new end - - # イベントリスナを新しく登録する - # ==== Args - # [event_name] イベント名 - # [&callback] イベントのコールバック - # ==== Return - # EventListener - def add_event(event_name, &callback) - type_strict event_name => :to_sym, callback => :call - result = EventListener.new(Event[event_name.to_sym], &callback) - @events << result - result end - - # イベントフィルタを新しく登録する - # ==== Args - # [event_name] イベント名 - # [&callback] イベントのコールバック - # ==== Return - # EventFilter - def add_event_filter(event_name, &callback) - type_strict event_name => :to_sym, callback => :call - result = EventFilter.new(Event[event_name.to_sym], &callback) - @filters << result - result end - - # イベントを削除する。 - # 引数は、EventListenerかEventFilterのみ(on_*やfilter_*の戻り値)。 - # 互換性のため、二つ引数がある場合は第一引数は無視され、第二引数が使われる。 - # ==== Args - # [*args] 引数 - # ==== Return - # self - def detach(*args) - listener = args.last - if listener.is_a? EventListener - @events.delete(listener) - listener.detach - elsif listener.is_a? EventFilter - @filters.delete(listener) - listener.detach end - self end - - # このプラグインを破棄する - # ==== Return - # self - def uninstall - @events.map &:detach - @filters.map &:detach - self.class.destroy name - execute_unload_hook - self end - # プラグインストレージの _key_ の値を取り出す # ==== Args # [key] 取得するキー @@ -161,32 +38,6 @@ class Plugin def store(key, val) super("#{@name}_#{key}".to_sym, val) end - # イベント _event_name_ を宣言する - # ==== Args - # [event_name] イベント名 - # [options] イベントの定義 - def defevent(event_name, options={}) - Event[event_name].options.merge!({plugin: self}.merge(options)) end - - # DSLメソッドを新しく追加する。 - # 追加されたメソッドは呼ぶと &callback が呼ばれ、その戻り値が返される。引数も順番通り全て &callbackに渡される - # ==== Args - # [dsl_name] 新しく追加するメソッド名 - # [&callback] 実行されるメソッド - # ==== Return - # self - def defdsl(dsl_name, &callback) - self.class.instance_eval { - define_method(dsl_name, &callback) } - self - end - - # プラグインが Plugin.uninstall される時に呼ばれるブロックを登録する。 - def onunload - @unload_hook ||= [] - @unload_hook.push(Proc.new) end - alias :on_unload :onunload - # mikutterコマンドを定義 # ==== Args # [slug] コマンドスラッグ @@ -209,9 +60,8 @@ class Plugin # 画像ファイルのパスを得る # ==== Args # - String filename ファイル名 - def get_skin(filename) + def get_skin(filename) plugin_skin_dir = File.join(spec[:path], "skin") - if File.exist?(plugin_skin_dir) Skin.get(filename, [plugin_skin_dir]) else @@ -219,23 +69,6 @@ class Plugin end end - # マジックメソッドを追加する。 - # on_?name :: add_event(name) - # filter_?name :: add_event_filter(name) - def method_missing(method, *args, &proc) - case method.to_s - when /\Aon_?(.+)\Z/ - add_event($1.to_sym, &proc) - when /\Afilter_?(.+)\Z/ - add_event_filter($1.to_sym, &proc) - when /\Ahook_?(.+)\Z/ - add_event_hook($1.to_sym, &proc) - else - super end end - - private - - def execute_unload_hook - @unload_hook.each{ |unload| unload.call } if(defined?(@unload_hook)) end - end + +Plugin.vm.Plugin = Plugin |