Creates a method that requires to be overridding. If it not overridden and called upon a TypeError will be raised.
require 'facet/module/abstract' class C abstract :a end c = C.new c.a #=> Error: undefined abstraction #a
METHODS_SYMBOLS | = | [ :inherited, :ancestors, :local, :no_acestors, :public, :private, :protected ] |
Shorthand for creating attributes.
require 'facet/module/attr' attr :r, :w=, :a, :a=
is equivalent to
attr_reader :r attr_writer :w attr_accessor :a
A "tester" form is also supported:
attr :q?
which translates to
def q? @q ? true : @q end
(see attr_tester)
Compatability is maintained with the old version of attr. So it is still possible to write:
attr :a, true
It has been taken expanded to allow multiple names as well:
attr :a, :b, :c, true
Modifies attr_accessor to return an array of the names of the methods it has defined.
Create an attribute method, _var?_, that returns a boolean test of on the instance variable. The result will always be either true, false or nil.
require 'facet/module/attr_checker' attr_checker :a
is equivalent to
def a? @a ? true : @a end
Modifies attr_reader to return an array of the names of the methods it has defined.
Create an attribute method for both getting and setting an instance variable.
require 'facet/module/attr_setter' attr_setter :a
_is equivalent to_
def a(*args) if args.size > 0 @a = args[0] self else @a end end
Modifies attr_writer to return an array of the names of the methods it has defined.
Returns the root name of the module/class.
require 'facet/module/basename' module Example class Demo end end Demo.name #=> Example::Demo Demo.basename #=> Demo
Note: the following documentation uses "class" because it’s more common, but it applies to modules as well.
Given the name of a class, returns the class itself (i.e. instance of Class). The dereferencing starts at Object. That is,
Class.by_name("String")
is equivalent to
Object.const_get("String")
The parameter name is expected to be a Symbol or String, or at least to respond to to_str.
An ArgumentError is raised if name does not correspond to an existing class. If name is not even a valid class name, the error you’ll get is not defined.
Examples:
require 'facet/module/by_name' Class.by_name("String") # -> String Class.by_name("::String") # -> String Class.by_name("Process::Sys") # -> Process::Sys Class.by_name("GorillaZ") # -> (ArgumentError) Class.by_name("Enumerable") # -> Enumerable Module.by_name("Enumerable") # -> Enumerable
Automatically create an initializer assigning the given arguments.
require 'facet/class/initializer' class MyClass initializer(:a, "b", :c) end
_is equivalent to_
class MyClass def initialize(a, b, c) @a,@b,@c = a,b,c end end
Downside: Initializers defined like this can’t take blocks. This can be fixed when Ruby 1.9 is out.
The initializer will not raise an Exception when the user does not supply a value for each instance variable. In that case it will just set the instance variable to nil. You can assign default values or raise an Exception in the block.
Directive for making your functions faster by trading space for time. When you "memoize" a method/function its results are cached so that later calls with the same arguments returns results in the cache instead of recalculating them.
require 'facet/module/memoize' class T def initialize(a) @a = a end def a "#{@a ^ 3 + 4}" end memoize :a end t = T.new t.a.__id__ #=> t.a.__id__ #=>
Provides an improved method lookup routnine. It returns a list of methods according to symbol(s) given.
Usable symbols include:
If no symbol is given then :public is assumed. Unrecognized symbols raise an error.
require 'facet/module/methods' module Demo def test puts("Hello World!") end end Demo.methods(:local) #=> ['test']
Redirect methods to other methods. This simply defines methods by the name of a hash key which calls the method with the name of the hash’s value.
require 'facet/module/redirect' class Example redirect :hi => :hello, :hey => :hello def hello(name) puts "Hello, #{name}." end end e = Example.new e.hello("Bob") #=> "Hello, Bob." e.hi("Bob") #=> "Hello, Bob." e.hey("Bob") #=> "Hello, Bob."
The above class definition is equivalent to:
class Example def hi(*args) hello(*args) end def hey(*args) hello(*args) end def hello puts "Hello" end end
Alias a module function so that the alias is also a module function. The typical alias_method does not do this.
require 'facet/moodule/alias_module_function' module Demo module_function def hello "Hello" end end Demo.hello #=> Hello module Demo alias_module_function( :hi , :hello ) end Demo.hi #=> Hello
Creates a new method for a pre-existing method. If aliased is set to true (the default) then the old_method is called subsequent to calling the new definition IF the new call returns nil, otherwise the return value of the new call is returned.
This can not be used to wrap methods that take a block.
require 'facet/module/redefine_method' redefine_method( sym, aliased ) { |*args| ... }