Ruby annotations
In the programming world, an annotation is a way to mark the code that is below it for many purposes. In Cucumber, the tags it uses are a kind of annotation to apply callbacks and classify some features and scenarios:
@billing Feature: Verify billing @important Scenario: Missing product description Scenario: Several products
In the case of VRaptor, we can use annotations to specify a controller as a REST resource or to restrict the access method to an action:
@Resource public class ShoppingCartController { ... } public class ProductsController { @Post @Path("/products") public void add(Product product) {...} ... }
In the Ruby language, two annotations that are very used are the methods protected and private, which without arguments restrict the visibility of the methods defined below them:
class User def jump; end; protected def eat; end; def flirt; end; private def sleep; end; def dream; end; end
In some situations we may want to annotate our code like this, for example to specify that a method is deprecated, functionality that is offered by the gem Canivete from Douglas Campos:
class Bomb deprecate def explode; end end
In the previous code, when somebody calls Bomp#explode, the interpreter will effectively execute the method, but also will output: Warning: calling deprecated method Bomb.explode.
The key to this behavior is the method_added method which is present in all Ruby modules and which is called every time a method is defined, receiving the name of the method as the parameter.
We can use this method, for example, to create an annotation that specifies that the methods declared below it can only be called by an admin, something like this:
class Module def method_added(name) unless @_admin_only.nil? or @_proxy_method @_proxy_method = true alias_method "_admin_#{name}", name module_eval <<-STRING def #{name}(*args, &block) _admin_#{name}(*args, &block) if admin? end STRING @_proxy_method = false end end def admin_only @_admin_only = true end end class User def admin? [true, false][rand(2)] end admin_only def update_password puts "password updated" end def restart_server puts "server restarted" end end
In the previous code, #admin? will randonmly return true or false and depending of the result the called method will be executed or not.

