document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-28885\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"k\">module<\/span> <span class=\"nn\">BlahPlugin<\/span><\/div><div class=\"line\" id=\"LC2\">&nbsp;&nbsp;<span class=\"no\">VERSION<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;1.0.0&#39;<\/span><\/div><div class=\"line\" id=\"LC3\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC4\">&nbsp;&nbsp;<span class=\"k\">class<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"nb\">self<\/span><\/div><div class=\"line\" id=\"LC5\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># add plugin to AR only if it hasn&#39;t been included before, <\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># which may cause stack-level-too-deep errors if you&#39;re aliasing methods<\/span><\/div><div class=\"line\" id=\"LC7\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">#<\/span><\/div><div class=\"line\" id=\"LC8\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nf\">enable_activerecord<\/span><\/div><div class=\"line\" id=\"LC9\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"k\">if<\/span> <span class=\"no\">ActiveRecord<\/span><span class=\"o\">::<\/span><span class=\"no\">Base<\/span><span class=\"o\">.<\/span><span class=\"n\">respond_to?<\/span> <span class=\"ss\">:acts_as_blah<\/span><\/div><div class=\"line\" id=\"LC10\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"no\">ActiveRecord<\/span><span class=\"o\">::<\/span><span class=\"no\">Base<\/span><span class=\"o\">.<\/span><span class=\"n\">extend<\/span> <span class=\"no\">BlahPlugin<\/span><span class=\"o\">::<\/span><span class=\"no\">Macro<\/span><\/div><div class=\"line\" id=\"LC11\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC12\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;<\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;<span class=\"k\">module<\/span> <span class=\"nn\">Macro<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># his class level method injects the rest of the plugin behaviour in the affected class.<\/span><\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># use like this:<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># class Post &lt; ActiveRecord::Base<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">#   acts_as_blah<\/span><\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># end<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">#<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nf\">acts_as_blah<\/span><span class=\"p\">(<\/span><span class=\"n\">opts<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:some_option<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"kp\">true<\/span><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># don&#39;t include modules twice<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"k\">if<\/span> <span class=\"nb\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">included_modules<\/span><span class=\"o\">.<\/span><span class=\"n\">include?<\/span><span class=\"p\">(<\/span><span class=\"no\">BlahPlugin<\/span><span class=\"o\">::<\/span><span class=\"no\">InstanceMethods<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># include class and instanc methods<\/span><\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"kp\">extend<\/span> <span class=\"no\">BlahPlugin<\/span><span class=\"o\">::<\/span><span class=\"no\">ClassMethods<\/span><\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"kp\">include<\/span> <span class=\"no\">BlahPlugin<\/span><span class=\"o\">::<\/span><span class=\"no\">InstanceMethods<\/span><\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># do something else, like initializing options<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;<span class=\"k\">end<\/span> <\/div><div class=\"line\" id=\"LC30\">&nbsp;<\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;<span class=\"k\">module<\/span> <span class=\"nn\">ClassMethods<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># class methods injected by the plugin, alias_method chaining, macro calls (has_many, after_save, validates),etc.<\/span><\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;<\/div><div class=\"line\" id=\"LC35\">&nbsp;&nbsp;<span class=\"k\">module<\/span> <span class=\"nn\">InstanceMethods<\/span><\/div><div class=\"line\" id=\"LC36\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\"># instance methods injected by the plugin. callbacks, etc.<\/span><\/div><div class=\"line\" id=\"LC37\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC38\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC39\"><span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC40\">&nbsp;<\/div><div class=\"line\" id=\"LC41\"><span class=\"nb\">require<\/span> <span class=\"s1\">&#39;rubygems&#39;<\/span><\/div><div class=\"line\" id=\"LC42\"><span class=\"nb\">require<\/span> <span class=\"s1\">&#39;active_record&#39;<\/span><\/div><div class=\"line\" id=\"LC43\"><span class=\"c1\"># enable the thing!<\/span><\/div><div class=\"line\" id=\"LC44\"><span class=\"no\">BlahPlugin<\/span><span class=\"o\">.<\/span><span class=\"n\">enable_activerecord<\/span><\/div><div class=\"line\" id=\"LC45\">&nbsp;<\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/28885/336acdfbab9bb63b58a9bbf63a94462a6070371a/gistfile1.rb\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/28885#file_gistfile1.rb\" style=\"float:right;margin-right:10px;color:#666\">gistfile1.rb<\/a>\n          <a href=\"http://gist.github.com/28885\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
