Module: Seatbelt::Pool::Api
Overview
Public: Provides storage of meta-method definitions. All classes that declare (API) meta-methods have to include this module by using the Seatbelt::Terminal wrapper.
For API design matters: gist.github.com/dsci/a96048884fdff81aca68
Instance Method Summary collapse
-
#api_method(*args) ⇒ Object
Public: Registeres a meta-method at the method pool by adding the method configuration to a lookup table.
-
#lookup_tbl ⇒ Object
Public: An accessor to the lookup table array.
Instance Method Details
#api_method(*args) ⇒ Object
Public: Registeres a meta-method at the method pool by adding the method configuration to a lookup table.
Each class that includes Seatbelt::Terminal has its own lookup table.
*args - An argument list consisting of
* method_name - that has to be the first argument (required)
* options - an options Hash that refines the methods usage:
:scope - the method type
[:instance, :class]
defaults to :instance
:block_required - defines if the method
require a Ruby Block for
usage.
:args - An array of expected
arguments as Symbols or
Strings. If omitted the
method expects no arguments.
If no arguments are passed, a Seatbelt::Errors::ArgumentsMissmatchError is raised. Raises a Seatbelt::Errors::MissingMetaMethodName, if no meta-method name was given. If a meta-method name is passed that already exists in the lookup table, a Seatbelt::Errors::MetaMethodDuplicateError is raised.
This will be a private method with Seatbelt 1.0.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/seatbelt/core/pool.rb', line 40 def api_method(*args) raise Errors::ArgumentsMissmatchError if args.empty? raise Errors::MissingMetaMethodName if args.first.is_a?(Hash) if lookup_tbl.map{|n| n.keys}.flatten.include?(args.first) raise Errors::MetaMethodDuplicateError end = { :scope => :instance, :block_required => false, :arity => 0 } = args. if .has_key?(:args) arity = .delete(:args) size = arity.size block_size = lambda do block_match = arity.join(",").scan(/\&{1,}/) size = size - block_match.size if block_match return size end if arity.join(",").match(/\*{1,}/) size = -block_size.call eqls = arity.join(",").scan(/[\=]+/).size size = size + eqls [:arity] = size else size = block_size.call eqls = arity.join(",").scan(/[\=]+/).size size = eqls > 0 ? -size : size [:arity] = size end end = { args.first => .merge() } lookup_tbl.set() end |
#lookup_tbl ⇒ Object
Public: An accessor to the lookup table array.
Creates the table if it doesn’t exists.
Returns an instance of Lookup Table
83 84 85 86 |
# File 'lib/seatbelt/core/pool.rb', line 83 def lookup_tbl @lookup_tbl = LookupTable.new if @lookup_tbl.nil? return @lookup_tbl end |