x2c 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (359) hide show
  1. data/README +103 -0
  2. data/x2c/config.rb +59 -0
  3. data/x2c/core/args.rb +36 -0
  4. data/x2c/core/client.rb +61 -0
  5. data/x2c/core/collection.rb +136 -0
  6. data/x2c/core/configure.rb +43 -0
  7. data/x2c/core/meta.rb +77 -0
  8. data/x2c/core/prompt.rb +59 -0
  9. data/x2c/core/resulteval.rb +133 -0
  10. data/x2c/doc.rb +243 -0
  11. data/x2c/doc/Array/cdesc-Array.yaml +21 -0
  12. data/x2c/doc/Array/format-i.yaml +10 -0
  13. data/x2c/doc/Array/inspect-i.yaml +10 -0
  14. data/x2c/doc/Array/to_s-i.yaml +10 -0
  15. data/x2c/doc/Fixnum/cdesc-Fixnum.yaml +20 -0
  16. data/x2c/doc/Fixnum/hour-i.yaml +12 -0
  17. data/x2c/doc/Fixnum/min-i.yaml +12 -0
  18. data/x2c/doc/Fixnum/sec-i.yaml +12 -0
  19. data/x2c/doc/Hash/cdesc-Hash.yaml +21 -0
  20. data/x2c/doc/Hash/format-i.yaml +10 -0
  21. data/x2c/doc/Hash/inspect-i.yaml +10 -0
  22. data/x2c/doc/Hash/to_s-i.yaml +10 -0
  23. data/x2c/doc/Help/cdesc-Help.yaml +30 -0
  24. data/x2c/doc/Help/help-c.yaml +10 -0
  25. data/x2c/doc/Help/help_hacks-c.yaml +10 -0
  26. data/x2c/doc/Help/ignore-c.yaml +10 -0
  27. data/x2c/doc/Help/irb_help-c.yaml +10 -0
  28. data/x2c/doc/Help/match%3f-c.yaml +10 -0
  29. data/x2c/doc/Help/trace_help-c.yaml +10 -0
  30. data/x2c/doc/IRB/ExtendCommandBundle/cdesc-ExtendCommandBundle.yaml +15 -0
  31. data/x2c/doc/IRB/Prompt/%5b%5d-i.yaml +10 -0
  32. data/x2c/doc/IRB/Prompt/cdesc-Prompt.yaml +36 -0
  33. data/x2c/doc/IRB/Prompt/config-i.yaml +10 -0
  34. data/x2c/doc/IRB/Prompt/main%3d-i.yaml +12 -0
  35. data/x2c/doc/IRB/Prompt/new-c.yaml +10 -0
  36. data/x2c/doc/IRB/Prompt/pop-i.yaml +10 -0
  37. data/x2c/doc/IRB/Prompt/push-i.yaml +10 -0
  38. data/x2c/doc/IRB/Prompt/set-i.yaml +11 -0
  39. data/x2c/doc/IRB/Prompt/start-i.yaml +10 -0
  40. data/x2c/doc/IRB/cdesc-IRB.yaml +15 -0
  41. data/x2c/doc/Kernel/cdesc-Kernel.yaml +16 -0
  42. data/x2c/doc/Kernel/xmms-i.yaml +12 -0
  43. data/x2c/doc/NilClass/cdesc-NilClass.yaml +16 -0
  44. data/x2c/doc/NilClass/inspect-i.yaml +10 -0
  45. data/x2c/doc/Object/cdesc-Object.yaml +18 -0
  46. data/x2c/doc/Object/format-i.yaml +10 -0
  47. data/x2c/doc/Object/to_d-i.yaml +12 -0
  48. data/x2c/doc/Prompting/activate-i.yaml +12 -0
  49. data/x2c/doc/Prompting/back-i.yaml +12 -0
  50. data/x2c/doc/Prompting/cdesc-Prompting.yaml +45 -0
  51. data/x2c/doc/Prompting/gointo-i.yaml +12 -0
  52. data/x2c/doc/Prompting/inspect-i.yaml +12 -0
  53. data/x2c/doc/Prompting/intersect-i.yaml +12 -0
  54. data/x2c/doc/Prompting/last%3d-i.yaml +12 -0
  55. data/x2c/doc/Prompting/last-i.yaml +12 -0
  56. data/x2c/doc/Prompting/lost-i.yaml +12 -0
  57. data/x2c/doc/Prompting/makelast-i.yaml +12 -0
  58. data/x2c/doc/Prompting/pop-i.yaml +12 -0
  59. data/x2c/doc/Prompting/push-i.yaml +12 -0
  60. data/x2c/doc/Prompting/stack-i.yaml +12 -0
  61. data/x2c/doc/Prompting/to_s-i.yaml +12 -0
  62. data/x2c/doc/Prompting/union-i.yaml +12 -0
  63. data/x2c/doc/String/cdesc-String.yaml +18 -0
  64. data/x2c/doc/String/format-i.yaml +10 -0
  65. data/x2c/doc/String/inspect-i.yaml +10 -0
  66. data/x2c/doc/Xmms/Browse/%5b%5d-i.yaml +12 -0
  67. data/x2c/doc/Xmms/Browse/cd-i.yaml +17 -0
  68. data/x2c/doc/Xmms/Browse/cdesc-Browse.yaml +34 -0
  69. data/x2c/doc/Xmms/Browse/dirs-i.yaml +12 -0
  70. data/x2c/doc/Xmms/Browse/files-i.yaml +12 -0
  71. data/x2c/doc/Xmms/Browse/format-i.yaml +10 -0
  72. data/x2c/doc/Xmms/Browse/get-i.yaml +12 -0
  73. data/x2c/doc/Xmms/Browse/list-i.yaml +12 -0
  74. data/x2c/doc/Xmms/Browse/mlib_add-i.yaml +12 -0
  75. data/x2c/doc/Xmms/Browse/open-i.yaml +12 -0
  76. data/x2c/doc/Xmms/Client/Chains/cdesc-Chains.yaml +39 -0
  77. data/x2c/doc/Xmms/Client/Chains/info-i.yaml +12 -0
  78. data/x2c/doc/Xmms/Client/Chains/remove-i.yaml +12 -0
  79. data/x2c/doc/Xmms/Client/Chains/song-i.yaml +12 -0
  80. data/x2c/doc/Xmms/Client/Config/cdesc-Config.yaml +18 -0
  81. data/x2c/doc/Xmms/Client/Config/config-i.yaml +18 -0
  82. data/x2c/doc/Xmms/Client/Daemon/cdesc-Daemon.yaml +27 -0
  83. data/x2c/doc/Xmms/Client/Daemon/connect-i.yaml +10 -0
  84. data/x2c/doc/Xmms/Client/Daemon/dead_daemon-i.yaml +12 -0
  85. data/x2c/doc/Xmms/Client/Daemon/post_daemon-i.yaml +12 -0
  86. data/x2c/doc/Xmms/Client/Daemon/pre_daemon-i.yaml +12 -0
  87. data/x2c/doc/Xmms/Client/Daemon/start_daemon-i.yaml +12 -0
  88. data/x2c/doc/Xmms/Client/IPlayback/cdesc-IPlayback.yaml +22 -0
  89. data/x2c/doc/Xmms/Client/IPlayback/pause-i.yaml +12 -0
  90. data/x2c/doc/Xmms/Client/IPlayback/play-i.yaml +12 -0
  91. data/x2c/doc/Xmms/Client/IPlayback/skip-i.yaml +12 -0
  92. data/x2c/doc/Xmms/Client/ListNames/cdesc-ListNames.yaml +20 -0
  93. data/x2c/doc/Xmms/Client/ListNames/setup_list-i.yaml +12 -0
  94. data/x2c/doc/Xmms/Client/ListNames/setup_lists-i.yaml +12 -0
  95. data/x2c/doc/Xmms/Client/Mlib/browse-i.yaml +14 -0
  96. data/x2c/doc/Xmms/Client/Mlib/cdesc-Mlib.yaml +20 -0
  97. data/x2c/doc/Xmms/Client/Mlib/rehash-i.yaml +12 -0
  98. data/x2c/doc/Xmms/Client/Remember/cdesc-Remember.yaml +25 -0
  99. data/x2c/doc/Xmms/Client/Remember/gointo-i.yaml +12 -0
  100. data/x2c/doc/Xmms/Client/Remember/inspect-i.yaml +10 -0
  101. data/x2c/doc/Xmms/Client/Remember/push-i.yaml +12 -0
  102. data/x2c/doc/Xmms/Client/Remember/to_s-i.yaml +10 -0
  103. data/x2c/doc/Xmms/Client/Search/cdesc-Search.yaml +17 -0
  104. data/x2c/doc/Xmms/Client/Shortcut/cdesc-Shortcut.yaml +22 -0
  105. data/x2c/doc/Xmms/Client/Shortcut/now-i.yaml +12 -0
  106. data/x2c/doc/Xmms/Client/Shortcut/seek-i.yaml +12 -0
  107. data/x2c/doc/Xmms/Client/Shortcut/volume-i.yaml +14 -0
  108. data/x2c/doc/Xmms/Client/Vote/cdesc-Vote.yaml +24 -0
  109. data/x2c/doc/Xmms/Client/Vote/rating-i.yaml +12 -0
  110. data/x2c/doc/Xmms/Client/Vote/remove_rating%21-i.yaml +12 -0
  111. data/x2c/doc/Xmms/Client/Vote/undo_voting-i.yaml +12 -0
  112. data/x2c/doc/Xmms/Client/Vote/vote-i.yaml +12 -0
  113. data/x2c/doc/Xmms/Client/__connect-i.yaml +12 -0
  114. data/x2c/doc/Xmms/Client/async_start-i.yaml +12 -0
  115. data/x2c/doc/Xmms/Client/bindata_add-i.yaml +10 -0
  116. data/x2c/doc/Xmms/Client/bindata_retrieve-i.yaml +10 -0
  117. data/x2c/doc/Xmms/Client/c-i.yaml +12 -0
  118. data/x2c/doc/Xmms/Client/cdesc-Client.yaml +169 -0
  119. data/x2c/doc/Xmms/Client/coll_find-i.yaml +12 -0
  120. data/x2c/doc/Xmms/Client/coll_get-i.yaml +12 -0
  121. data/x2c/doc/Xmms/Client/coll_idlist_from_playlist_file-i.yaml +12 -0
  122. data/x2c/doc/Xmms/Client/coll_list-i.yaml +12 -0
  123. data/x2c/doc/Xmms/Client/coll_query_ids-i.yaml +12 -0
  124. data/x2c/doc/Xmms/Client/coll_query_info-i.yaml +12 -0
  125. data/x2c/doc/Xmms/Client/coll_remove-i.yaml +12 -0
  126. data/x2c/doc/Xmms/Client/coll_rename-i.yaml +12 -0
  127. data/x2c/doc/Xmms/Client/coll_save-i.yaml +12 -0
  128. data/x2c/doc/Xmms/Client/configure-i.yaml +12 -0
  129. data/x2c/doc/Xmms/Client/configval_get-i.yaml +12 -0
  130. data/x2c/doc/Xmms/Client/configval_list-i.yaml +12 -0
  131. data/x2c/doc/Xmms/Client/configval_register-i.yaml +12 -0
  132. data/x2c/doc/Xmms/Client/configval_set-i.yaml +12 -0
  133. data/x2c/doc/Xmms/Client/connect-i.yaml +10 -0
  134. data/x2c/doc/Xmms/Client/continue-i.yaml +11 -0
  135. data/x2c/doc/Xmms/Client/format-i.yaml +12 -0
  136. data/x2c/doc/Xmms/Client/handled_connect-i.yaml +10 -0
  137. data/x2c/doc/Xmms/Client/help-i.yaml +16 -0
  138. data/x2c/doc/Xmms/Client/main-c.yaml +12 -0
  139. data/x2c/doc/Xmms/Client/main_stats-i.yaml +12 -0
  140. data/x2c/doc/Xmms/Client/medialib_add_entry-i.yaml +10 -0
  141. data/x2c/doc/Xmms/Client/medialib_entry_property_remove-i.yaml +10 -0
  142. data/x2c/doc/Xmms/Client/medialib_entry_property_set-i.yaml +10 -0
  143. data/x2c/doc/Xmms/Client/medialib_entry_remove-i.yaml +10 -0
  144. data/x2c/doc/Xmms/Client/medialib_get_id-i.yaml +10 -0
  145. data/x2c/doc/Xmms/Client/medialib_get_info-i.yaml +10 -0
  146. data/x2c/doc/Xmms/Client/medialib_path_import-i.yaml +10 -0
  147. data/x2c/doc/Xmms/Client/medialib_rehash-i.yaml +10 -0
  148. data/x2c/doc/Xmms/Client/medialib_select-i.yaml +10 -0
  149. data/x2c/doc/Xmms/Client/new-c.yaml +12 -0
  150. data/x2c/doc/Xmms/Client/on_disconnect-i.yaml +10 -0
  151. data/x2c/doc/Xmms/Client/playback_pause-i.yaml +12 -0
  152. data/x2c/doc/Xmms/Client/playback_seek_ms-i.yaml +12 -0
  153. data/x2c/doc/Xmms/Client/playback_seek_ms_rel-i.yaml +12 -0
  154. data/x2c/doc/Xmms/Client/playback_seek_samples-i.yaml +12 -0
  155. data/x2c/doc/Xmms/Client/playback_seek_samples_rel-i.yaml +12 -0
  156. data/x2c/doc/Xmms/Client/playback_start-i.yaml +12 -0
  157. data/x2c/doc/Xmms/Client/playback_stop-i.yaml +12 -0
  158. data/x2c/doc/Xmms/Client/playback_tickle-i.yaml +12 -0
  159. data/x2c/doc/Xmms/Client/playback_volume_get-i.yaml +12 -0
  160. data/x2c/doc/Xmms/Client/playback_volume_set-i.yaml +12 -0
  161. data/x2c/doc/Xmms/Client/playbacklist-i.yaml +10 -0
  162. data/x2c/doc/Xmms/Client/playlist-i.yaml +12 -0
  163. data/x2c/doc/Xmms/Client/playlist_list-i.yaml +12 -0
  164. data/x2c/doc/Xmms/Client/playlist_set_next-i.yaml +12 -0
  165. data/x2c/doc/Xmms/Client/playlist_set_next_rel-i.yaml +12 -0
  166. data/x2c/doc/Xmms/Client/plugin_list-i.yaml +12 -0
  167. data/x2c/doc/Xmms/Client/post_connect-i.yaml +10 -0
  168. data/x2c/doc/Xmms/Client/pre_connect-i.yaml +12 -0
  169. data/x2c/doc/Xmms/Client/quit-i.yaml +12 -0
  170. data/x2c/doc/Xmms/Client/setup-i.yaml +12 -0
  171. data/x2c/doc/Xmms/Client/showprompt-i.yaml +10 -0
  172. data/x2c/doc/Xmms/Client/shutdown-i.yaml +12 -0
  173. data/x2c/doc/Xmms/Client/welcome-i.yaml +10 -0
  174. data/x2c/doc/Xmms/Client/xform_media_browse-i.yaml +10 -0
  175. data/x2c/doc/Xmms/Collection/%26-i.yaml +12 -0
  176. data/x2c/doc/Xmms/Collection/%5b%5d%3d-i.yaml +12 -0
  177. data/x2c/doc/Xmms/Collection/%5b%5d-i.yaml +12 -0
  178. data/x2c/doc/Xmms/Collection/%7c-i.yaml +12 -0
  179. data/x2c/doc/Xmms/Collection/%7e-i.yaml +12 -0
  180. data/x2c/doc/Xmms/Collection/Attributes/add-i.yaml +12 -0
  181. data/x2c/doc/Xmms/Collection/Attributes/cdesc-Attributes.yaml +25 -0
  182. data/x2c/doc/Xmms/Collection/Attributes/field-i.yaml +12 -0
  183. data/x2c/doc/Xmms/Collection/Attributes/field_string-i.yaml +10 -0
  184. data/x2c/doc/Xmms/Collection/Attributes/format-i.yaml +10 -0
  185. data/x2c/doc/Xmms/Collection/Chains/cdesc-Chains.yaml +39 -0
  186. data/x2c/doc/Xmms/Collection/Chains/list-i.yaml +12 -0
  187. data/x2c/doc/Xmms/Collection/Chains/load-c.yaml +12 -0
  188. data/x2c/doc/Xmms/Collection/Chains/load_form_file-c.yaml +12 -0
  189. data/x2c/doc/Xmms/Collection/Chains/play-i.yaml +12 -0
  190. data/x2c/doc/Xmms/Collection/Chains/playlist-i.yaml +12 -0
  191. data/x2c/doc/Xmms/Collection/Chains/save-i.yaml +12 -0
  192. data/x2c/doc/Xmms/Collection/FormQuery/cdesc-FormQuery.yaml +22 -0
  193. data/x2c/doc/Xmms/Collection/FormQuery/method_missing-i.yaml +14 -0
  194. data/x2c/doc/Xmms/Collection/Info/cdesc-Info.yaml +32 -0
  195. data/x2c/doc/Xmms/Collection/Info/info-i.yaml +12 -0
  196. data/x2c/doc/Xmms/Collection/Info/inspect-i.yaml +10 -0
  197. data/x2c/doc/Xmms/Collection/Operands/cdesc-Operands.yaml +18 -0
  198. data/x2c/doc/Xmms/Collection/Operands/empty%3f-i.yaml +10 -0
  199. data/x2c/doc/Xmms/Collection/Query/%3c%3d-i.yaml +10 -0
  200. data/x2c/doc/Xmms/Collection/Query/%3e%3d-i.yaml +10 -0
  201. data/x2c/doc/Xmms/Collection/Query/%7e-i.yaml +10 -0
  202. data/x2c/doc/Xmms/Collection/Query/_-i.yaml +12 -0
  203. data/x2c/doc/Xmms/Collection/Query/cdesc-Query.yaml +32 -0
  204. data/x2c/doc/Xmms/Collection/Query/exist%3f-i.yaml +12 -0
  205. data/x2c/doc/Xmms/Collection/Query/format-i.yaml +10 -0
  206. data/x2c/doc/Xmms/Collection/Query/has-i.yaml +13 -0
  207. data/x2c/doc/Xmms/Collection/Query/new-c.yaml +10 -0
  208. data/x2c/doc/Xmms/Collection/Vote/acceptable-i.yaml +10 -0
  209. data/x2c/doc/Xmms/Collection/Vote/awesome-i.yaml +10 -0
  210. data/x2c/doc/Xmms/Collection/Vote/cdesc-Vote.yaml +32 -0
  211. data/x2c/doc/Xmms/Collection/Vote/good-i.yaml +10 -0
  212. data/x2c/doc/Xmms/Collection/Vote/nice-i.yaml +10 -0
  213. data/x2c/doc/Xmms/Collection/Vote/notsucking-i.yaml +10 -0
  214. data/x2c/doc/Xmms/Collection/Vote/unvoted-i.yaml +12 -0
  215. data/x2c/doc/Xmms/Collection/and-i.yaml +12 -0
  216. data/x2c/doc/Xmms/Collection/attribute-i.yaml +10 -0
  217. data/x2c/doc/Xmms/Collection/cdesc-Collection.yaml +140 -0
  218. data/x2c/doc/Xmms/Collection/complement-i.yaml +12 -0
  219. data/x2c/doc/Xmms/Collection/default-c.yaml +12 -0
  220. data/x2c/doc/Xmms/Collection/format-i.yaml +12 -0
  221. data/x2c/doc/Xmms/Collection/idlis-i.yaml +12 -0
  222. data/x2c/doc/Xmms/Collection/idlist%3d-i.yaml +12 -0
  223. data/x2c/doc/Xmms/Collection/intersect-i.yaml +12 -0
  224. data/x2c/doc/Xmms/Collection/load-c.yaml +10 -0
  225. data/x2c/doc/Xmms/Collection/new-c.yaml +10 -0
  226. data/x2c/doc/Xmms/Collection/new_constructor-c.yaml +12 -0
  227. data/x2c/doc/Xmms/Collection/new_list-c.yaml +12 -0
  228. data/x2c/doc/Xmms/Collection/new_pshuffle-c.yaml +12 -0
  229. data/x2c/doc/Xmms/Collection/new_selection-c.yaml +12 -0
  230. data/x2c/doc/Xmms/Collection/not-i.yaml +12 -0
  231. data/x2c/doc/Xmms/Collection/operand-i.yaml +10 -0
  232. data/x2c/doc/Xmms/Collection/or-i.yaml +12 -0
  233. data/x2c/doc/Xmms/Collection/parent-i.yaml +12 -0
  234. data/x2c/doc/Xmms/Collection/pshuffle-i.yaml +12 -0
  235. data/x2c/doc/Xmms/Collection/queue-i.yaml +12 -0
  236. data/x2c/doc/Xmms/Collection/tree_inject-i.yaml +12 -0
  237. data/x2c/doc/Xmms/Collection/tree_walk-i.yaml +12 -0
  238. data/x2c/doc/Xmms/Collection/typ-i.yaml +10 -0
  239. data/x2c/doc/Xmms/Collection/union-i.yaml +12 -0
  240. data/x2c/doc/Xmms/Collection/universe-c.yaml +12 -0
  241. data/x2c/doc/Xmms/Config/%5b%5d%3d-i.yaml +10 -0
  242. data/x2c/doc/Xmms/Config/%5b%5d-i.yaml +10 -0
  243. data/x2c/doc/Xmms/Config/cdesc-Config.yaml +47 -0
  244. data/x2c/doc/Xmms/Config/configs-i.yaml +10 -0
  245. data/x2c/doc/Xmms/Config/format-i.yaml +10 -0
  246. data/x2c/doc/Xmms/Config/join-i.yaml +10 -0
  247. data/x2c/doc/Xmms/Config/keys-i.yaml +10 -0
  248. data/x2c/doc/Xmms/Config/method_missing-i.yaml +10 -0
  249. data/x2c/doc/Xmms/Config/methods-i.yaml +10 -0
  250. data/x2c/doc/Xmms/Config/new-c.yaml +10 -0
  251. data/x2c/doc/Xmms/Config/parent-i.yaml +10 -0
  252. data/x2c/doc/Xmms/Config/respond_to%3f-i.yaml +10 -0
  253. data/x2c/doc/Xmms/Config/subs-i.yaml +10 -0
  254. data/x2c/doc/Xmms/Config/subtrees-i.yaml +10 -0
  255. data/x2c/doc/Xmms/Duration/cdesc-Duration.yaml +25 -0
  256. data/x2c/doc/Xmms/Duration/format-i.yaml +10 -0
  257. data/x2c/doc/Xmms/Duration/new-c.yaml +10 -0
  258. data/x2c/doc/Xmms/Duration/to_s-i.yaml +10 -0
  259. data/x2c/doc/Xmms/Format/cdesc-Format.yaml +22 -0
  260. data/x2c/doc/Xmms/Format/format-i.yaml +10 -0
  261. data/x2c/doc/Xmms/Format/inspect-i.yaml +10 -0
  262. data/x2c/doc/Xmms/Format/to_s-i.yaml +10 -0
  263. data/x2c/doc/Xmms/Info/cdesc-Info.yaml +32 -0
  264. data/x2c/doc/Xmms/Info/count-i.yaml +12 -0
  265. data/x2c/doc/Xmms/Info/format-i.yaml +12 -0
  266. data/x2c/doc/Xmms/Info/inspect-i.yaml +10 -0
  267. data/x2c/doc/Xmms/Info/method_missing-i.yaml +10 -0
  268. data/x2c/doc/Xmms/Info/new-c.yaml +10 -0
  269. data/x2c/doc/Xmms/Info/search-i.yaml +12 -0
  270. data/x2c/doc/Xmms/Info/to_s-i.yaml +10 -0
  271. data/x2c/doc/Xmms/Media/cdesc-Media.yaml +31 -0
  272. data/x2c/doc/Xmms/Media/format-i.yaml +10 -0
  273. data/x2c/doc/Xmms/Media/media-i.yaml +12 -0
  274. data/x2c/doc/Xmms/Media/mlib_add-i.yaml +12 -0
  275. data/x2c/doc/Xmms/Media/new-c.yaml +10 -0
  276. data/x2c/doc/Xmms/Media/parent-i.yaml +12 -0
  277. data/x2c/doc/Xmms/Options/%5b%5d%3d-c.yaml +10 -0
  278. data/x2c/doc/Xmms/Options/%5b%5d-c.yaml +10 -0
  279. data/x2c/doc/Xmms/Options/cdesc-Options.yaml +24 -0
  280. data/x2c/doc/Xmms/Options/get_argv-c.yaml +10 -0
  281. data/x2c/doc/Xmms/Options/help-c.yaml +10 -0
  282. data/x2c/doc/Xmms/Options/opts-c.yaml +10 -0
  283. data/x2c/doc/Xmms/Playlist/Chains/cdesc-Chains.yaml +18 -0
  284. data/x2c/doc/Xmms/Playlist/Chains/play-i.yaml +12 -0
  285. data/x2c/doc/Xmms/Playlist/Shortcut/add-i.yaml +12 -0
  286. data/x2c/doc/Xmms/Playlist/Shortcut/cdesc-Shortcut.yaml +24 -0
  287. data/x2c/doc/Xmms/Playlist/Shortcut/insert-i.yaml +12 -0
  288. data/x2c/doc/Xmms/Playlist/Shortcut/move-i.yaml +12 -0
  289. data/x2c/doc/Xmms/Playlist/Shortcut/remove_entries-i.yaml +12 -0
  290. data/x2c/doc/Xmms/Playlist/add_collection-i.yaml +12 -0
  291. data/x2c/doc/Xmms/Playlist/add_entry-i.yaml +12 -0
  292. data/x2c/doc/Xmms/Playlist/cdesc-Playlist.yaml +56 -0
  293. data/x2c/doc/Xmms/Playlist/clear-i.yaml +12 -0
  294. data/x2c/doc/Xmms/Playlist/collection-i.yaml +12 -0
  295. data/x2c/doc/Xmms/Playlist/current_pos-i.yaml +12 -0
  296. data/x2c/doc/Xmms/Playlist/entries-i.yaml +12 -0
  297. data/x2c/doc/Xmms/Playlist/format-i.yaml +10 -0
  298. data/x2c/doc/Xmms/Playlist/insert_entry-i.yaml +12 -0
  299. data/x2c/doc/Xmms/Playlist/load-i.yaml +12 -0
  300. data/x2c/doc/Xmms/Playlist/name-i.yaml +12 -0
  301. data/x2c/doc/Xmms/Playlist/new-c.yaml +12 -0
  302. data/x2c/doc/Xmms/Playlist/playlist_move_entry-i.yaml +12 -0
  303. data/x2c/doc/Xmms/Playlist/radd-i.yaml +12 -0
  304. data/x2c/doc/Xmms/Playlist/remove-i.yaml +12 -0
  305. data/x2c/doc/Xmms/Playlist/remove_entry-i.yaml +12 -0
  306. data/x2c/doc/Xmms/Playlist/shuffle-i.yaml +12 -0
  307. data/x2c/doc/Xmms/Playlist/sort-i.yaml +12 -0
  308. data/x2c/doc/Xmms/PropDict/Mlib/cdesc-Mlib.yaml +30 -0
  309. data/x2c/doc/Xmms/PropDict/Mlib/method_missing-i.yaml +10 -0
  310. data/x2c/doc/Xmms/PropDict/Mlib/methods-i.yaml +10 -0
  311. data/x2c/doc/Xmms/PropDict/Mlib/rehash-i.yaml +12 -0
  312. data/x2c/doc/Xmms/PropDict/Mlib/remove%21-i.yaml +12 -0
  313. data/x2c/doc/Xmms/PropDict/Mlib/respond_to%3f-i.yaml +10 -0
  314. data/x2c/doc/Xmms/PropDict/cdesc-PropDict.yaml +27 -0
  315. data/x2c/doc/Xmms/PropDict/format-i.yaml +10 -0
  316. data/x2c/doc/Xmms/PropDict/id-i.yaml +10 -0
  317. data/x2c/doc/Xmms/PropDict/inspect-i.yaml +10 -0
  318. data/x2c/doc/Xmms/PropDict/to_h-i.yaml +10 -0
  319. data/x2c/doc/Xmms/PropDict/to_s-i.yaml +10 -0
  320. data/x2c/doc/Xmms/Remember/cdesc-Remember.yaml +18 -0
  321. data/x2c/doc/Xmms/Result/cdesc-Result.yaml +20 -0
  322. data/x2c/doc/Xmms/Result/val-i.yaml +12 -0
  323. data/x2c/doc/Xmms/Song/cdesc-Song.yaml +29 -0
  324. data/x2c/doc/Xmms/Song/format-c.yaml +12 -0
  325. data/x2c/doc/Xmms/Song/format-i.yaml +10 -0
  326. data/x2c/doc/Xmms/Song/info-i.yaml +10 -0
  327. data/x2c/doc/Xmms/Song/new-c.yaml +10 -0
  328. data/x2c/doc/Xmms/Songlist/Chains/cdesc-Chains.yaml +29 -0
  329. data/x2c/doc/Xmms/Songlist/Chains/idlist-i.yaml +12 -0
  330. data/x2c/doc/Xmms/Songlist/Chains/queue-i.yaml +12 -0
  331. data/x2c/doc/Xmms/Songlist/cdesc-Songlist.yaml +37 -0
  332. data/x2c/doc/Xmms/Songlist/collection-i.yaml +10 -0
  333. data/x2c/doc/Xmms/Songlist/format-i.yaml +10 -0
  334. data/x2c/doc/Xmms/Songlist/format_hash-i.yaml +10 -0
  335. data/x2c/doc/Xmms/Songlist/info_hash-i.yaml +10 -0
  336. data/x2c/doc/Xmms/Songlist/new-c.yaml +10 -0
  337. data/x2c/doc/Xmms/Songlist/songs-i.yaml +12 -0
  338. data/x2c/doc/Xmms/Songlist/to_s-i.yaml +10 -0
  339. data/x2c/doc/Xmms/cdesc-Xmms.yaml +18 -0
  340. data/x2c/doc/Xmms/save_call-c.yaml +12 -0
  341. data/x2c/doc/created.rid +1 -0
  342. data/x2c/plug/async.rb +50 -0
  343. data/x2c/plug/chains.rb +148 -0
  344. data/x2c/plug/config.rb +90 -0
  345. data/x2c/plug/daemon.rb +72 -0
  346. data/x2c/plug/format.rb +251 -0
  347. data/x2c/plug/help.rb +240 -0
  348. data/x2c/plug/info.rb +86 -0
  349. data/x2c/plug/iplayback.rb +49 -0
  350. data/x2c/plug/listnames.rb +43 -0
  351. data/x2c/plug/mlib.rb +128 -0
  352. data/x2c/plug/query.rb +51 -0
  353. data/x2c/plug/remember.rb +124 -0
  354. data/x2c/plug/shortcuts.rb +108 -0
  355. data/x2c/plug/tutorial.rb +134 -0
  356. data/x2c/plug/vote.rb +77 -0
  357. data/x2c/x2c +36 -0
  358. data/x2c/x2c.rb +16 -0
  359. metadata +453 -0
data/README ADDED
@@ -0,0 +1,103 @@
1
+ = x2c - the interactive ruby compiler
2
+
3
+ The client itself is an irb shell executing commands on the client object, which
4
+ has been extended to get a powerful and easy interface to playback, playlists
5
+ and collections. As it is all ruby, you can easily extend its functionality,
6
+ create new aliases or functions, or create you own client on top of it.
7
+
8
+ == First Steps
9
+ === Installation
10
+ If you want use the gem (to keep you system clean or things like that), just
11
+ build it out of the gemspec and install it:
12
+ gem build x2c.gemspec
13
+ sudo gem install x2c-0.1.gem
14
+ But you also can simply copy the x2c folder somewhere on your disc and run ./x2c
15
+ directly or symlink to it.
16
+
17
+ === Usage
18
+ If you start x2c, you will be confronted with a short tutorial helping you with
19
+ the first steps in x2c. After you finisched the tutorial and seted up the
20
+ config, you can use x2c normally. You can get descriptions about functions and
21
+ modules with the help command.
22
+
23
+ == the design
24
+
25
+ x2c creates a new xmms client objects, and starts a new irb workspace with the
26
+ client as its main object. Both client and workspace are extended to have some
27
+ extra functionalities.
28
+
29
+ So all you do is calling functions with arguments on the xmms client. Therefore
30
+ you must type valid ruby syntax, but it allows you to get all the power of ruby.
31
+ There are 3 main objects inside the xmms client lib and inside my client:
32
+ * the client itself: where all the function calls go. It is the interface to
33
+ daemon, you can git information about the medialib and change playback with it.
34
+ * playlists: they are play ;) and song are removed, moved or inserted
35
+ * collections: powerful way to express media queries
36
+ * theres also another thing called Songlist, which is used to pass around song
37
+ ids
38
+
39
+ == the interface
40
+
41
+ All output is formated to give you information about the objects you process and
42
+ the state you are inside
43
+
44
+ === understanding the output
45
+
46
+ ==== the commandline
47
+
48
+ The commandline will show the playback status, e.g. '>>' for PLAY, '||' for PAUSE and
49
+ '[]' for STOP, and the song currently played followed by a Symbol to show you what
50
+ mode you are in, dependent of the command what irb expects you to do.
51
+
52
+ In addition to that, the async module will put out '->' followed by the new Song,
53
+ whenever the current Song changes.
54
+
55
+ ==== results
56
+
57
+ The results of your commands will be put after a '=>'. As that results will be
58
+ often used for further processing, there is a variable that holds useful
59
+ results. All results considered useful are marked with a trailing '`' , so
60
+ whenever you see a '`' in front of a output, the last variable is set. You can
61
+ explicitly make a result last, if you append .makelast to your command.
62
+ Furthermore you can push results to the stack to pop them later. Just used
63
+ (command).push to push the result, or just push to push the last result. You
64
+ also can restore the prelast result with the lost command.
65
+
66
+ Results will be printed after the => in a readable way:
67
+ * collections will show the hole tree of operations: first the operations and
68
+ its options are printed, followed by its operands in the next line. Operations
69
+ are shown as symbols, '%' for pshuffle ':' for idlist, ']' for a queue, '>>'
70
+ for a reference, '!' for complement, '&' for intersection, '|' for union, '='
71
+ for a field equals value collection, '~' for a Match, '>' and '<' for
72
+ comparing and 'E' for existents of an attribute.
73
+ * playlists show the collection on which they are based on and the list of songs.
74
+ The current song will be marked with a '>'
75
+ * Songlists just how there Songs
76
+ * Arrays and Hashes show all of their members
77
+
78
+ === functions calls and message passing
79
+ ==== Message passing
80
+
81
+ All classes have gained additional functions, and messages are often passed to
82
+ other classes. The client object for example will forward messages to
83
+ Collections or the playlist and the last result object. Playlists itself will
84
+ pass unknown functions to its current Collections. Collections will try to make
85
+ itself a playlist when needed. Songlists and id-Arrays will try to be the same,
86
+ just that Songlists have some extra functionality and a nicer output.
87
+
88
+ ==== Functions
89
+ The help command uses the autogenreate rdoc to give you help about all the
90
+ functions and objects. just uses the help command to get all the information.
91
+ help
92
+ help{Client}
93
+ help{Client::<Inculded Module>}
94
+ help{<command>}
95
+ help{Collection::<Inculded Module>}
96
+ ...
97
+
98
+ === Client Configuration
99
+ You can configure the client with the .config/xmms2/x2c/config.rb file. You
100
+ first have to copy the default configuration with the setup command. Afterwords
101
+ you can use the configure command to edit the file.
102
+
103
+ PS: feel free to ask me or say what you like/dislike.
@@ -0,0 +1,59 @@
1
+ module Xmms
2
+ # output things nicely
3
+ require 'plug/format.rb'
4
+ # nice interface to genrated docs
5
+ require 'plug/help.rb'
6
+ # make Xmms::Client more usable
7
+ require 'plug/shortcuts.rb'
8
+ # better playback functions (pause will unpause when pause),
9
+ # play can load music, skip will skip n track and tickle
10
+ require 'plug/iplayback'
11
+ # easy collection creation
12
+ require 'plug/query.rb'
13
+ # make classes interact with each other
14
+ require 'plug/chains.rb'
15
+ # stack and last functions
16
+ require 'plug/remember.rb'
17
+ # we need async module to display playback events
18
+ require 'plug/async.rb'
19
+ # shortcuts to load collections
20
+ require 'plug/listnames.rb'
21
+ # info gathering for collections
22
+ require 'plug/info.rb'
23
+ # load config interface
24
+ require 'plug/config.rb'
25
+ # automatically start local daemon
26
+ require 'plug/daemon.rb'
27
+ # voting/rating module
28
+ require 'plug/vote.rb'
29
+ # mlib interface
30
+ require 'plug/mlib.rb'
31
+
32
+ class Client
33
+ MEDIA_DIR = '.'
34
+ def pre_connect
35
+ end
36
+ # setup some things
37
+ def post_connect
38
+ async_start # requires async.rb
39
+ playbacklist # requires async.rb
40
+ setup_lists # requires chains.rb
41
+ end
42
+ # for the daemon plugin
43
+ def pre_daemon
44
+ end
45
+ def post_daemon(ipc_path)
46
+ start
47
+ end
48
+ def dead_daemon
49
+ end
50
+ shortcut :l, :last
51
+ shortcut :n, :skip
52
+ shortcut :p, :pause
53
+ shortcut :c, :config
54
+ shortcut :s, :search
55
+ shortcut :h, :help
56
+ end
57
+ # define custom functionality here,
58
+ # or include you own ruby files
59
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+ module Xmms
3
+ module Options
4
+ @@opts = Hash.new
5
+ @@help = Hash.new
6
+ def self.opts
7
+ @@opts
8
+ end
9
+ def self.help
10
+ " "+@@help.values.format
11
+ end
12
+ def self.get_argv opt, val
13
+ upt = opt.upcase.gsub(/-/,'_')
14
+ i = ARGV.index('--'+opt)
15
+ arg = if i
16
+ ARGV.delete_at(i) if i
17
+ ARGV[i].nil? || ARGV[i][0..1]=='--' || ARGV.delete_at(i)
18
+ end
19
+ lambda {arg || Xmms::Client.const_defined?(upt) && Xmms::Client.const_get(upt) || ENV[upt] || val}
20
+ end
21
+ def self.[] arg
22
+ if arg.is_a? Hash
23
+ arg.each_pair do |k,a|
24
+ a.first = false if(a.first == 'false')
25
+ @@opts[k] = get_argv(k,a.first)
26
+ @@help[k] = "--#{k}\n #{a.last}\n default: #{a.first}"
27
+ end
28
+ else
29
+ @@opts[arg].call
30
+ end
31
+ end
32
+ def self.[]= key, val
33
+ @@opts[key]=lambda{val}
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+
3
+ # this module improves collection handling of the Cleint object and
4
+ # remembers the first started client, any object can access it
5
+ require 'core/args.rb'
6
+
7
+ module Kernel
8
+ # returns a xmms2 client object
9
+ def xmms
10
+ Xmms::Client.main
11
+ end
12
+ end
13
+ module Xmms
14
+ # the Client object is the main interface to the deamon.
15
+ # by default, all commands will be executed on the Client.
16
+ # To give you more power, the client will include many plugins/modules
17
+ # to give you extra functionality. You can get extra help on all of the Includes.
18
+ class Client
19
+ Options['xmms-path' => ['unix:///tmp/xmms-ipc', 'the socket path x2c connects to']]
20
+ @@main = nil
21
+ # return reference to the first known client
22
+ def self.main
23
+ @@main || raise(Client::DisconnectedError,"no running xmms client found")
24
+ end
25
+
26
+ alias_method :__initialize, :initialize
27
+ # set up xmms Client, connect to deamonn and set main refrence
28
+ def initialize name='x2c'
29
+ __initialize(name)
30
+ @@main ||= self
31
+ end
32
+ alias_method :__connect, :connect
33
+ def handled_connect path
34
+ puts "... connecting to daemon at #{path}"
35
+ __connect(path)
36
+ on_disconnect do
37
+ puts "\n... lost connection to deamon. bye."
38
+ Kernel.exit 1
39
+ end
40
+ end
41
+ # try to connect to the daemon
42
+ def connect path=Options['xmms-path']
43
+ begin
44
+ handled_connect(path)
45
+ rescue ClientError => e
46
+ puts "\n... #{path}: #{e}"
47
+ exit 1
48
+ end
49
+ end
50
+ alias_method :__shutdown, :quit
51
+ # shutdown the daemon
52
+ def shutdown
53
+ puts "\n... shutting down daemon. bye."
54
+ __shutdown.val
55
+ exit 0
56
+ end
57
+ # exit the client
58
+ def quit; end
59
+ undef_method :quit
60
+ end
61
+ end
@@ -0,0 +1,136 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+
3
+ require 'core/meta.rb'
4
+ require 'core/resulteval.rb'
5
+
6
+ # helpers for eassy collection manipulation
7
+ module Xmms
8
+ # Collections represent a selection of music out of you MLib.
9
+ #
10
+ # you can create them with the normal constructor Collection.new,
11
+ # or use the special constructors Collection.new_<type>:
12
+ # * new_equals: a field equals a value
13
+ # * new_match: a field matches a value
14
+ # * new_greater: a field is greater as a value
15
+ # * new_smaller: a field is smaller as a value
16
+ # * new_smaller: a field is smaller as a value
17
+ # * new_has: the media has a certain field
18
+ # * new_queue: create a queue out of ids
19
+ # * new_idlist: create a queue out of ids
20
+ # * univierse: get all media
21
+ # * default: get the default base of collections
22
+ #
23
+ # there are some functions on collections, that extract infomation and give you new ghings
24
+ # * c.attributes and c.operrands give you the internal information
25
+ # * c.idlist return the internal idlist of queues, pshuffles and idlists
26
+ # * c.parent return the base of the collection
27
+ class Collection
28
+ class Operands
29
+ def empty?
30
+ self.to_a.empty?
31
+ end
32
+ end
33
+ class Attributes
34
+ # get Attribute as Hash: { field => value}
35
+ def field
36
+ {self["field"] => self["value"]}
37
+ end
38
+ # add the attrHash to the attributes list
39
+ def add attrHash
40
+ attrHash.each_pair do |k,v|
41
+ self[k.to_s] = v.to_s
42
+ end
43
+ end
44
+ end
45
+ attr_accessor :name
46
+ # go through hole operands tree and call block with |collection, depth|
47
+ def tree_walk d=0, &block
48
+ yield(self, d)
49
+ self.operands.each do |o|
50
+ o.tree_walk(d+1, &block)
51
+ end
52
+ end
53
+ # tree_walk with accumulater
54
+ def tree_inject a=self, d=0, &block
55
+ a = yield(a,d,self) #unless a=self
56
+ self.operands.each do |o|
57
+ a = o.tree_inject(a,d+1,&block)
58
+ end;a
59
+ end
60
+
61
+ # return an attribute
62
+ def [] field
63
+ attributes[field]
64
+ end
65
+ # set an attribute
66
+ def []= field, val
67
+ self.name ||= val
68
+ attributes[field]= val
69
+ end
70
+ # return the default base collection for new collections
71
+ def self.default
72
+ universe
73
+ end
74
+
75
+ # create pshuffle out of the collection
76
+ def pshuffle
77
+ Collection.new_pshuffle(self)
78
+ end
79
+ # create queue out of the collection
80
+ def queue
81
+ Collection.new_queue(self.list.ids)
82
+ end
83
+ # get the parent of the collection, eg. the collection this one is based on
84
+ def parent
85
+ operands.find{true}
86
+ end
87
+
88
+ # construct new constructor, used to define all of the new_<type> functions
89
+ def self.new_constructor ref, hash
90
+ hash.each_pair do |n,t|
91
+ module_eval <<-EOE
92
+ def self.#{n.to_s} *args
93
+ u = args.first.is_a?(Collection) ? args.shift : Collection.default
94
+ self.#{ref.to_s}(#{t},u,*args)
95
+ end
96
+ EOE
97
+ end
98
+ end
99
+ # create a new list (queue or idlist)
100
+ def self.new_list type, base, ids
101
+ ids = ids.ids if ids.is_a?(Songlist)
102
+ c = Collection.new(type)
103
+ c.name = "#{base.name}:"
104
+ c.idlist = ids
105
+ return c
106
+ end
107
+ # create a new selection, eg. equals, less, ...
108
+ # type is by default equals and the base of the list is the default one
109
+ # and an attribute has of type :field => :value, ...
110
+ def self.new_selection type, base, hash
111
+ hash.each_pair do|f,v|
112
+ c = Collection.new(type)
113
+ c.name ||= "#{base.name+'.' if base.name}#{v}"
114
+ c.operands.push base
115
+ c.attributes.add(:field => f, :value =>v)
116
+ base = c
117
+ end;base
118
+ end
119
+
120
+ # create a pshuffle out of base, if base is a hash, create an new_equals
121
+ def self.new_pshuffle base=Collection.default
122
+ base = Collection.new_equals(base) if base.is_a? Hash
123
+ c = Collection.new(TYPE_PARTYSHUFFLE)
124
+ c.name = "#{base.name}%"
125
+ c.operands.push(base)
126
+ return c
127
+ end
128
+ # create new_equals, new_has, new_greater and new_smaller constructors
129
+ new_constructor :new_selection,
130
+ :new_equals => TYPE_EQUALS, :new_match => TYPE_MATCH, :new_has => TYPE_HAS,
131
+ :new_greater => TYPE_GREATER, :new_smaller => TYPE_SMALLER
132
+ # create new_queue and new_idlist constructors
133
+ new_constructor :new_list,
134
+ :new_queue => TYPE_QUEUE, :new_idlist => TYPE_IDLIST
135
+ end
136
+ end
@@ -0,0 +1,43 @@
1
+ # interface for client configuration. it will load config.
2
+ module Xmms
3
+ # don't quit on excetions in user code
4
+ def self.save_call
5
+ begin
6
+ yield
7
+ rescue Exception => e
8
+ puts "!! check your config: #{e}"
9
+ puts "!! "+e.backtrace.format("!! ")
10
+ end
11
+ end
12
+ class Client
13
+ # edit you config file
14
+ def configure editor=ENV['EDITOR']||'vi'
15
+ system "#{editor} #{File.join(X2C_CONF,'config.rb')}"
16
+ end
17
+ # copy config into userconfdir
18
+ def setup
19
+ src = File.join(X2C_ROOT,'config.rb')
20
+ [`mkdir #{X2C_CONF} 2>&1`+
21
+ `mkdir #{File.join(X2C_CONF,'plug')} 2>&1`+
22
+ `cp #{src} #{X2C_CONF} 2>&1`+
23
+ "created confdir #{X2C_CONF} with the files",
24
+ `ls #{X2C_CONF} 2>&1`.split.map{|n| '> '+n}]
25
+ end
26
+ # empty methods that can be overwritten
27
+ def pre_connect; end
28
+ def post_connect; end
29
+ def welcome; end
30
+ end
31
+ begin
32
+ require File.join(X2C_CONF,'config.rb')
33
+ rescue LoadError => l
34
+ if l.message =~ /#{File.join(X2C_CONF,'config.rb')}/
35
+ require 'config.rb'
36
+ require 'plug/tutorial.rb'
37
+ else
38
+ require 'config.rb'
39
+ puts "!! check your config: #{l}"
40
+ puts "!! "+l.backtrace.format("!! ")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,77 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+ # some metaprogrammming stuff
3
+ module Help
4
+ @@ignore ||= Hash.new
5
+ def self.ignore klass, hash
6
+ @@ignore[klass] = (@@ignore[klass] || Hash.new).merge hash
7
+ end
8
+ end
9
+
10
+ def shortcut new, old
11
+ Help.ignore(self, new.to_sym => :skip)
12
+ class_eval <<-EVAL
13
+ def #{new} *args, &block
14
+ #{old} *args, &block
15
+ end
16
+ EVAL
17
+ end
18
+ def alias_forward new, target, old=new
19
+ if target.is_a?(Symbol)
20
+ Help.ignore(self,
21
+ new => {target.to_sym => :over})
22
+ define_method(new) do |*args|
23
+ send(target).send(old,*args)
24
+ end
25
+ else
26
+ Help.ignore(self, new => {})
27
+ define_method(new) do |*args|
28
+ target.send(old, *args)
29
+ end
30
+ end
31
+ end
32
+
33
+ def dynamic_forward target
34
+ respond = "__respond_to_#{target}?"
35
+ methods = "__methods_#{target}"
36
+ missing = "__method_missing_#{target}"
37
+ Help.ignore(self,
38
+ :method_missing => {respond.to_sym => :over,
39
+ target.to_sym => :over,
40
+ missing.to_sym => :skip})
41
+ Help.ignore(Kernel, respond.to_sym => :over)
42
+ class_eval <<-EVAL
43
+ alias_method :#{respond}, :respond_to?
44
+ alias_method :#{methods}, :methods
45
+ def respond_to? *args
46
+ #{respond}(*args) || #{target}.respond_to?(*args)
47
+ end
48
+ def methods
49
+ #{methods} + #{target}.methods
50
+ end
51
+ alias_method :#{missing}, :method_missing
52
+ def method_missing id, *args, &block
53
+ if #{respond}(id)
54
+ #{missing}(id,*args,&block)
55
+ else
56
+ #{target}.send(id,*args,&block)
57
+ end
58
+ end
59
+ EVAL
60
+ end
61
+
62
+ def after_method_hook id, &block
63
+ oid = "__#{id}".to_sym
64
+ alias_method oid, id
65
+ define_method id do |*args|
66
+ block.call(send(oid,*args))
67
+ end
68
+ end
69
+ def before_method_hook id, &block
70
+ oid = "__#{id}".to_sym
71
+ alias_method oid, id
72
+ define_method id do |*args|
73
+ catch(:nocall) do
74
+ send(oid, *block.call(*args))
75
+ end
76
+ end
77
+ end