x2c 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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