アセトアルデヒドの勢いで変な物を書いたような気がします。書きかけですけれども。
Games::DateTime - A simple date and time object on any games

たまには脇道に逸れて、ff14.nameおよびff14.asia向けの部品的なモジュールを書くというのも、気分転換に良いかも知れません。何に対しての気分転換かというと、独り身の帰宅路で涙にむせぶ件といったところでしょうか。
上掲のスクリーンショットのような「時計」であればFlashやJavaScriptでもよく見掛けるのですが、「ローカルタイムな地球現在時→仮想世界の現在時」以外に
- 仮想世界の日時→地球の日時方向への変換
- ローカルタイム以外のタイムゾーンへの対応
- 地球日時もしくは仮想世界の日時の指定
- 時間計算(地球および仮想世界の両方)
などが出来る「日付時刻クラス」というのは寡聞にして知らないので、書きました。取り敢えずググって要件を見つけられたのはFF11だけでしたが、起点日時の対称が見付かれば、プレースホルダー的に置くだけ置いたEverQuestなどの実装にも対応出来るかも知れません。
ちなみにスクリーンショットの時計はライブラリー本体ではなくexamplesディレクトリー以下のおまけであるGames::DateTime::Clockです。ff14.nameやff14.asiaでは、最終的にはこれとGames::DateTimeをJavaScriptに移植することになります。
なお、Acme::*以下の名前空間にするかどうかは考え中です。また、テストは酔いが覚めてから書く予定です。などと書いていると肝臓が明日も泣きそうな気がします。
備忘録ですが、MooseX::AbstractFactoryで、ファクトリーメソッドに指定する具象クラス名(の一部)を指定する際にエイリアスを使えるようにしています。ただしHashRefを渡さずにエイリアスクラス名(の一部)を渡す際には、宝箱を開ける為の鍵が当該宝箱の中にあるような状態で、いまいちです。
Mooseの型制約を遅延設定するMooseX::Types::Games::DateTime辺りの小細工(実装クラスに依存してwhereブロック内の振る舞いを規定する、など)については、稿を改めようと思います。
- 1日24時間という世界の具象クラスでは
hourが0 <= $_ && $_ < 24の範囲になり、 - 1日30時間という世界の具象クラスでは
hourが0 <= $_ && $_ < 30の範囲になる
という要件があったときに、事前に(静的に)それぞれ別の型制約を作らずに、最大値を具象クラスから引っこ抜いて型制約で使うということです。これもまたいまいちな実装ですけれども。
追記: テストを薄く書いてバグを除いたほか、見本の時計はロケールにも対応させました。また、cp932でなくUnicodeなコンソールでの字詰めの問題等々を解消しています。上記スクリーンショットも差し替えています。全角半角の「文字幅」の取り扱い方については、(時間があれば)稿を改めて備忘録を起こす予定です。
最近のコメント