Modelとは

mikutterでTwitter上のオブジェクト以外のものを扱うには、Modelを新しく定義し、それを利用します。Modelはmikutter上で値を扱うことに特化しており、Modelを使ってデータを表現することで、例えばそれをタイムライン上でツイートのように表示することができるようになります。

MessageやUserといった、mikutterでよく扱うオブジェクトも、全てModelの一部です。mikutter 3.5では、プラグインがこのModelを独自に定義することで、Twitter以外のオブジェクトを扱うことができるようになります。

最小のModel

class BlankModel < Retriever::Model
end

Modelは、`Retriever::Model`を継承したクラスのことで、新たなModelを追加するには、これを継承したクラスを新たに作れば良いのです。

値の読み書き

この状態では、[]`や[]=を使って、`Hash のように値を読み書きすることができます。

bm = BlankModel.new
bm[:foo] = 1
bm[:foo] # => 1

ただし、キーは`Symbol`にしましょう。

URI

すべてのModelのインスタンスには、URIが割り振られています。違うデータを示すなら、必ずこれは違う値になります。

bm = BlankModel.new
bm.uri # => blankmodel://blankmodel/550e8400-e29b-41d4-a716-446655440000

デフォルトでは、上のように、インスタンスごとにランダムな値が生成されます。

インスタンスが異なっても、本質的に同じデータを指すものであれば、同じURIを返すようにしましょう。例えばツイートのURIは、以下の様に、ツイートのパーマリンクになっています。

https://twitter.com/toshi_a/status/781963811016155136

mikutterは、これによってModelの同一性を判定します。あなたが定義するModelも、一意なURIを返すように`uri`をオーバライドしましょう。

なお、`Retriever::Model#uri`の戻り値は、URI::Genericか、そのサブクラスです。

perma_linkとURI

Modelが`perma_link`メソッド(またはフィールド)を持っている場合、その戻り値がURIとして使われます。

httpまたはhttpsスキームを持っていて、Web上のリソースを指すのが`perma_link`です。一方`uri`は、それ以外のURI一般を含みます。`perma_link`は`uri`として使うことができるので、`perma_link`を定義して、それが一意なURLを返すなら、`uri`メソッドを定義する必要がありません。