フォルダ構造
/caramel.js /lib/*/*.js
caramel.jsの主な関数
caramel(string, function)
/lib/以下に格納されているjsファイルをロードし、フォルダ構造に従ってcaramelにマッピングを行なう。
第一引数に/lib/以下に格納されているjsファイルパスを指定する。
第二引数にコールバック関数を指定する。jsファイルのロードが完了すると実行される。
例
/lib/tabemono/udon.js
udon = function(){ this.oisii = true; this.komugi = true; };
lib/上のjsファイルは
- ファイル名から「.js」を除いた、同じ名前の変数に値を入れる
という規約を持っている。
これは従わなくても良いが、その場合caramelへのマッピングは行われない。
その他
caramel.object.check({ gundom:"number", bigO:"string", magin:{ z:"boolean", great:"function" }, tachikoma:function(t){ return t.motoko == "囁くのよ、私のゴーストが"; } }, { gundom:8, bigO:"神の名においてこれを鋳造する", magin:{ z:true, great:function(){} }, tachikoma:{motoko:"囁くのよ、私のゴーストが"} });
オブジェクトの中身をタイプチェックする関数。
第一引数は先生、第二引数はチェックされるオブジェクト。
第二引数が第一引数の書式と違った場合は問答無用でthrowが発生する。
動的にも静的クラスのタイプチェックがあっても、いいと思うんだ。
第一引数のオブジェクト内には
- 文字列(typeofで出力されるもの)
- オブジェクト
- 関数
が指定出来る。
文字列は単純にtypeofされる。
typeof 第二引数.gundom == 第二引数.gundom;
オブジェクトはオブジェクトのネストをチェックする為に使う。
チェックしたい値がオブジェクトである事を表現したい場合、"object"と指定する。
関数は第一引数にチェックされるオブジェクトの値が来るので、それを元に戻り値true/falseを出力するのが条件。
あと、文字列には"|"を使用できる。
caramel.object.check({ trickster:"function|object" }, { trickster:{} //あるいは、function(){}でもOK });
チェックしたい値が二個以上の型を持つおそれがある場合は"|"を使って二つ以上の型を指定できる。
あくまでtypeofの拡張のようなものなので、instanceofのようにクラス名を指定する事は出来ない。
その代わり、以下のような方法でクラス名でタイプチェックが行える
caramel.object.check({ twitter:caramel.object.checkClassName(Array, "string") },{ twitter:[] });
checkClassNameによってArrayと"string"をチェックできるようになる。
ここでいう"string"とStringは別物の扱いで、"string"の場合はtypeof、Stringの場合はinstanceofでチェックが行われる。
これは"number", "boolean"でも同じで、caramelではこの二つの型は別物の型であるという認識で扱う。
長々しく書いたけど、この関数とても気に入ってます。今まで自作したタイプチェック機構の中で一番きれい。
などというものを、今日は作っておりました。うふふ。
今後の未定
candy.js
candy = ["udon.js", "katudon.js"];
/lib/tabemono/candy.js
caramel("tabemono.candy");とか指定すると、配列上のjsを一気にロードしてくれる未定。
/lib/tabemono/*.jsとか出来ると楽なんだけどなー。
caramel.eat
caramel.eat({ name:"tabemono.yasai.ninzin", sweet:function(){} });
ロードするjs上に書いておくとcaramel.tabemono.yasai.ninzinにsweetをマッピングしてくれる未定。
多分実装しない。