Написание DSL, как Thor Gem в Ruby?
Я пытаюсь выяснить, как камень Thor создает DSL, как это (первый пример из их README)
class App < Thor # [1]
map "-L" => :list # [2]
desc "install APP_NAME", "install one of the available apps" # [3]
method_options :force => :boolean, :alias => :string # [4]
def install(name)
user_alias = options[:alias]
if options.force?
# do something
end
# other code
end
desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
def list(search="")
# list everything
end
end
В частности, как он знает, какой метод для отображения desc
а также method_options
позвонить?
1 ответ
Решение
desc
довольно легко реализовать, хитрость заключается в использовании Module.method_added
:
class DescMethods
def self.desc(m)
@last_message = m
end
def self.method_added(m)
puts "#{m} described as #{@last_message}"
end
end
любой класс, который наследует от DescMethods
будет иметь desc
метод как Thor
, Для каждого метода будет напечатано сообщение с названием и описанием метода. Например:
class Test < DescMethods
desc 'Hello world'
def test
end
end
когда этот класс определен, будет напечатана строка "test, описанный как Hello world".