Big Spoon adds ActiveRecord::Base-style
after_* callbacks around ANY Ruby method.
It's like a sandwich, where your method is the meat and your callbacks are the bread.
Out-of-the box, Big Spoon adds callbacks that are similar to ActiveRecord::Base. Of course there's, like, at least three ways to do that. So Big
Spoon supports all of 'em. Whatever form you choose, it'll swaddle your methods in the warm of
The most straightforward way is to do it ActiveRecord::Base style, which is to define a callback in the top of your class like so:
class User before_believe_in_a_thing_called_love :listen_to_the_rhythm_of_my_heart def believe_in_a_thing_called_love puts "We'll be rockin til the sun goes down!" end def listen_to_the_rhythm_of_my_heart listen("127.0.0.1") do match /(lub|dub)/ do puts "Edgar Allan Poe!" end end end
DataMapper has what I consider a slightly better API for doing this, specifically:
class User after :save, :get_your_hands_off_of_my_woman end
So Big Spoon supports that notation, too! This is in order to avoid conflicts with Rails callbacks and their siblings. But if'n you're a real scofflaw, you can just do it normal-like.
If you're STILL interested in avoiding any potential conflicts, you can isolate your hooks
completely by wrapping them in a block. Big Spoon adds a method named
spoon that accepts
a block to define hooks in.
spoon is aliased as
hooks, which in some cases conflicts
with other libraries. See below:
class User hooks do before :get_your_hands_off_of_my_woman, :listen_to_the_darkness end # This is the same as: spoon do before :get_your_hands_off_of_my_woman, :listen_to_the_darkness end protected def listen_to_the_darkness! `osascript "tell iTunes to play some awesome"` end end
So. Add hooks. To any Ruby method. That's pretty damn awesome, where I come form. I SAID "FORM," son!
But, as they say, "love is only a feeling." So spoon like there's no tomorrow.
Because ActiveModel callbacks are just so damn delightful, I've added some fun conditional sugar to match their wonderful. So g'head and add some
:if conditions to your callbacks:
class User before :love_on_the_rocks, :add_ice, :if => :no_ice? def love_on_the_rocks puts "Loo-OOOVE ON THE ROCKS! YOU'D DO ANYTHING FOR A QUIET LIFE!" end def no_ice? Ice.empty? end protected def add_ice Ice.create! end end
Conditional callbacks also support
:unless, just like their ActiveModel ancestors. Or should I say "inspiritors?" Is that word? Shut up, of course it is. Anyway:
class User before :love_on_the_rocks, :add_ice, :unless => :in_tys_mazada? def not_in_tys_mazada? (mazda = User.find_by_name("Ty").car) && mazda.has_rad_bass? end end
And to recap! Just as with the believing-in-things-called-love example, both could be re-written along these lines:
before_love_on_the_rocks :add_ice, :if => :no_ice? # or hooks do before :love_on_the_rocks, :add_if, :if => :no_ice? end
HAPPY CALLING-OF-THE-BACK, FRIENDS!
Copyright © 2012 Delightful Widgets Inc. No warranty so don't sue me or my company THANKS!