From: http://wiki.rubyonrails.org/rails/pages/HowTosPlugins
SomeImportantPluginNotes – before you start
Thanks to Kev Jackson and Jamis Buck for their help getting me started with writing acts_as_* plugins. This is a summary and plagiarism of their emails
This plugin adds a class method to a model that acts_as_chicken
A 6 step program to acting like a chicken…
Step 1
under your_app/vendor/plugins
create a directory “acts_as_chicken”
Step 2
in this directory create a lib directory
so now you should have
your_app/vendor/plugins/acts_as_chicken/lib
Step 3
in the acts_as_chicken directory create the following file with this content:
your_app/vendor/plugins/acts_as_chicken/init.rb
require 'acts_as_chicken'
Step 4
in the lib subdirectory add your code to a file called acts_as_chicken.rb
your_app/vendor/plugins/acts_as_chicken/lib/acts_as_chicken.rb
require 'active_record' module Foo module Acts #:nodoc: module Chicken #:nodoc: def self.append_features(base) super base.extend(ClassMethods) end module ClassMethods def acts_as_chicken class_eval do extend Foo::Acts::Chicken::SingletonMethods end end end # add your class methods here module SingletonMethods def cluck 'cluck' end #etc... end end end end ActiveRecord::Base.class_eval do include Foo::Acts::Chicken end
Step 5
Use your method in your classes
class Hen < ActiveRecord::Base acts_as_chicken end
Step 6
Use your method in your view.
<%= Hen.cluck %>
Jamis Buck suggested using some name like Foo in the above because “this will allow (potentially) multiple developers to develop identically-named features without conflict.” Other people use “ActiveRecord” in place of the three “Foo”. Jamis doesn’t like this use of ActiveRecord. He says “I’ve noticed many plugin developers taking this particular route, and I’d like to discourage it, strenuously. There really is no need to add your own acts to the ActiveRecord::Acts namespace. Instead, I’d encourage the creation of your own Acts namespace like Foo”
HowTosPlugins – Some tutorials to get started
What is missing here is a good description of the Ruby magic that is happening in step 4. Can someone in the know add this (then remove this message).