def define_callbacks(*symbols)
terminator = symbols.pop if symbols.last.is_a?(String)
symbols.each do |symbol|
self.extlib_inheritable_accessor("_#{symbol}_terminator")
self.send("_#{symbol}_terminator=", terminator)
self.class_eval "extlib_inheritable_accessor :_\#{symbol}_callbacks\nself._\#{symbol}_callbacks = CallbackChain.new(:\#{symbol})\n\ndef self.\#{symbol}_callback(*filters, &blk)\ntype = [:before, :after, :around].include?(filters.first) ? filters.shift : :before\noptions = filters.last.is_a?(Hash) ? filters.pop : {}\nfilters.unshift(blk) if block_given?\n\nfilters.map! do |filter|\n# overrides parent class\nself._\#{symbol}_callbacks.delete_if {|c| c.matches?(type, :\#{symbol}, filter)}\nCallback.new(filter, type, options.dup, self, :\#{symbol})\nend\nself._\#{symbol}_callbacks.push(*filters)\n_define_runner(:\#{symbol},\nself._\#{symbol}_callbacks.compile(nil, :terminator => _\#{symbol}_terminator),\noptions)\nend\n\ndef self.skip_\#{symbol}_callback(*filters, &blk)\ntype = [:before, :after, :around].include?(filters.first) ? filters.shift : :before\noptions = filters.last.is_a?(Hash) ? filters.pop : {}\nfilters.unshift(blk) if block_given?\nfilters.each do |filter|\nself._\#{symbol}_callbacks = self._\#{symbol}_callbacks.clone(self)\n\nfilter = self._\#{symbol}_callbacks.find {|c| c.matches?(type, :\#{symbol}, filter) }\nper_key = options[:per_key] || {}\nif filter\nfilter.recompile!(options, per_key)\nelse\nself._\#{symbol}_callbacks.delete(filter)\nend\n_define_runner(:\#{symbol},\nself._\#{symbol}_callbacks.compile(nil, :terminator => _\#{symbol}_terminator),\noptions)\nend\n\nend\n\ndef self.reset_\#{symbol}_callbacks\nself._\#{symbol}_callbacks = CallbackChain.new(:\#{symbol})\n_define_runner(:\#{symbol}, self._\#{symbol}_callbacks.compile, {})\nend\n\nself.\#{symbol}_callback(:before)\n", __FILE__, __LINE__ + 1
end
end