diff --git a/src/cligen/command.cr b/src/cligen/command.cr index bc2b071..f5fc097 100644 --- a/src/cligen/command.cr +++ b/src/cligen/command.cr @@ -6,12 +6,18 @@ require "./command/argument" require "./command/selection" require "./command/help_template" require "./command/subcommand" +require "./command/def_init" module CliGen class Command macro inherited {% verbatim do %} macro finished + {% anno = @type.annotation(CliGen::CommandInfo) %} + {% raise "" unless anno %} + {% if anno[:def_init] %} + def_init + {% end %} def initialize(*, handler : CliGen::BaseCommandNode) {% verbatim do %} {% for var in @type.instance_vars %} diff --git a/src/cligen/command/def_init.cr b/src/cligen/command/def_init.cr new file mode 100644 index 0000000..b268090 --- /dev/null +++ b/src/cligen/command/def_init.cr @@ -0,0 +1,22 @@ +module CliGen + class Command + macro def_init + def initialize + {% verbatim do %} + {% for var in @type.instance_vars %} + {% raise "ERROR : Can't define a default initializer if #{var.name} doesn't have a default" if var.default_value.nil? && !var.type.nilable? %} + @{{var.name}} = {{var.default_value}} + {% end %} + {% end %} + end + + def after_initialize + @@instance = self + end + + def self.get + @@instance ||= new + end + end + end +end